0

コンストラクターで別のクラス (Use と呼ばれる) に渡したい構成クラスがあります。構成クラスを Use クラス内にプライベート メンバー変数として格納したいと考えています。constにしたいです。

これまでのところ、私はこのコードを持っています:

class Configuration{
private:
    int value1_;
public:
    Configuration();
    Configuration(int value1){value1_=value1;}
    int value1() const {
        return value1_;
    }
};

class Use{
private:
    //const me
    Configuration config_;
    int something_;
public:
    Use(Configuration &config){
        config_=config;
    }

    void doSomething(){
        something_+=config_.value1();
    }
};

const したいのですUse::config_が、私が試みるすべての方法は、混乱を招くコンパイルエラーで終わります。どうすればいいのですか?

4

5 に答える 5

3

メンバーはであるためconst、コンストラクターはそれに割り当てることができません。ただし、初期化子リストから直接初期化できます。

Use(Configuration const & config) : config_(config) {}
于 2012-07-06T17:25:00.447 に答える
2

これをサポートする最善の方法は、参照を使用することです

class Use{
private:
    const Configuration& config_;
    int something_;
public:
    Use(const Configuration &config) : 
      config_(config), 
      something_(0) {

    }

    void doSomething(){
        something_+=config_.value1();
    }
};

Configuration質問でもう少し明確にする必要がある項目の 1 つは、とUseインスタンスの関係です。Configurationすべてのインスタンス間で共有することを意図したものがある場合Useは、(私が概説したように) 参照が最も適切な選択です。Configurationただし、そのシナリオでは、それを参照するすべてのUseインスタンスが存続することを確認する必要があります。

一方、がインスタンスConfigurationごとに 1 つであることを意図している場合はUse、非参照ソリューションがおそらくより適切です

于 2012-07-06T17:25:13.017 に答える
0

に割り当てることはできませんがconst、基本メンバー初期化子リストで初期化できます。

class Use{
private:
    const Configuration config_;
public:
    Use(const Configuration & config)
        : config_(config)
    {
    }
};
于 2012-07-06T17:29:17.503 に答える
0

コンスメンバーに値を割り当てるには、コンストラクターで初期化子を使用する必要があります

Use(Configuration &config)
: config_(config)
{
     ...
}
于 2012-07-06T17:25:16.117 に答える
0

configがクラスのメンバーとして宣言されている場合const、作成後に変更することはできません。これには、メンバーの初期化リスト内以外でそれに値を割り当てようとする試みが含まれます。また、そうでないメンバー関数を呼び出そうとするとconst、コンパイラ エラーが発生します。明示的なエラーを投稿していないので、サンプルコードがそのクラスのインスタンスでそのクラスのメンバー関数を呼び出すので、おそらくそれがあなたが持っているものだと推測しています。

于 2012-07-06T17:26:13.250 に答える