0


0

コピーコンストラクターのconstの正確性の問題?

メモリ管理などを利用するために、C構造体をC ++クラスでラップしようとしています。 私はその構造をプライベートメンバーに変え、アクセスを提供するパブリック機能を提供しました。 戻り値の型は定数です。オブジェクトを引数として使用するすべての関数には、署名に「const」が含まれているためです。

#include

class GSLRand {
    gsl_rng* r_;    // see links below

public:
    GSLRand() {
        gsl_rng_env_setup();
        r_ = gsl_rng_alloc(gsl_rng_default);
    }

    ~GSLRand() {
        gsl_rng_free(r_);
    }

    const gsl_rng* rng() {
        return r_;
    }
};

それはすべてうまくコンパイルされます。 この問題は、賢くなり、コピーコンストラクターを追加しようとすると発生します。 次のようなクラスに導入する…​

public:

GSLRand(const GSLRand&R){r_ = gsl_rng_alloc(gsl_rng_taus); gsl_rng_memcpy(r_、R.rng()); }


次のコンパイラエラーが表示されます。

GSLRand.h: In copy constructor ‘GSLRand::GSLRand(const GSLRand&)’:
GSLRand.h:35: error: passing ‘const GSLRand’ as ‘this’ argument of ‘gsl_rng* GSLRand::rng()’ discards qualifiers

Macでg ++を使用しています。 私はさまざまなバリエーションを試しましたが、それでもコンパイラー(または自分自身)をどのように混乱させているのかわかりません。 興味深いことに、 const`指定子を rng() `から削除すると、同じエラーが発生します。

何か案は?

使用される関数のドキュメント:http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Generation.html [乱数生成]、「環境変数」および「コピー」のセクション発電機。」

3 Answer


5


rng() const関数を作成します: const gsl_rng * rng()const {


3


この関数を次のように変更します。

const gsl_rng* rng() const {
    return r_;
}


2


2つの問題 まず、 const`オブジェクト参照を介して非 const`メンバー関数を呼び出しています。 できません。 `GSLRand

rnd()`を `const`メンバー関数にできます:

const gsl_rng * rng()const {

…​but then you have a second problem: gsl_rng() returns a `const gsl_rng *`ですが、これを非 `const`メンバー変数に割り当てようとしています。 それもできません。

道路の分岐点。 常に r_`ポインターを介して const`メンバー関数を呼び出すか、それを介して非 `const`メンバー関数を呼び出すことがあります。

常に const`メンバー関数を呼び出す場合、メンバー変数が const gsl_rng`を指すようにします:

const class gsl_rng* r_;    // see links below

そうでない場合は、メソッド自体を const`に保ちながら、 rng() 関数が非 const`ポインターを返すようにします。

gsl_rng* rng() const {
        return r_;
    }