コピーコンストラクタの引数で参照型のメンバ変数を初期化したいんですが

[戻る]
ガラ 2011/02/25(金) 08:30:03
VC++6.0 MFC XP
コピーコンストラクタの引数で参照型のメンバ変数を初期化したいんですが、
メンバ変数(m_Integer)の初期化は、できたのですが、
このメンバ変数を参照型(int &m_Integer)で宣言すると、以下のようなコンパイルエ
ラーがでます。
class CXXX  
{
public:
    CXXX();
    CXXX(int &A):m_Integer(A){m_Integer2 = m_Integer;};
    virtual ~CXXX();

    int    m_Integer ;    //このm_Intergerを参照変数にしたい
    int    m_Integer2 ;

    int GetInteger2() {return m_Integer2;} ;

};

error C2758: 'm_Integer' : オブジェクト コンストラクタの初期化リストで初期化されませんでした

それで、デフォルトコンストラクタを
CXXX():m_Integer(0){} ;
ということで対応しようとしましたが、
error C2354: 'm_Integer' : メンバへの参照の初期化にはテンポラリ変数が必要です。
というエラーが出力されます。
なにかいい手は、ないでしょうか?

tetrapod 2011/02/25(金) 09:51:56
参照ってことは参照される何かが必要なわけだが、その辺の理解は大丈夫かな?
このクラスをデフォルトコンストラクトする際に、その参照される何かを
どこから持ってくるか?が設計で、それにあわせて実装すればいい。
コピーコンストラクトも同様。

参照元の寿命が尽きてしまった後に参照だけ残っている・・という悲しい事態に
ならないようにしなきゃならんよ。

ホウジョウウサギ 2011/02/25(金) 10:05:13
そもそも 参照型のメンバ変数にまともな参照先を指定せずに
デフォルトコンストラクタを使って
そのクラスのインスタンスを作ることに意味があるのか?という疑問があります.
(どういう挙動になることを期待するのか??)

デフォルトコンストラクタを定義しない
のが正解と思いますが,

「どうしてもデフォルトコンストラクタが欲しくて単にコンパイルエラーをつぶしたいだ
け」なら
staticなメンバでも指定しておくとか…

class CTest
{
public:
    CTest() : m_Ref(ms_dummy) {}
    CTest( int &A ) : m_Ref(A) {}
private:
    int &m_Ref;
private:
    static int ms_dummy;   //ダミー
};

ガラ 2011/02/25(金) 10:18:05
tetrapod さんレスありがとうございます。
クラスPa --+----クラス CHILD_A
       +----クラス CHILD_B
という構成で、クラスCHILD_Aで作ったテーブルをクラスCHILD_Bで参照したいと思って
います。
そこでクラスPでメンバにテーブルをもってCHILD_A、CHILD_Bで使うというようにした
いと思います。
class CPa()
{
    CPa() ;
    CPa~() ;
    vector<int>    m_table ;
}
------------------------------------
CPa()
{
    CChildA Childa(m_table) ;    
    CChildB Childb(m_talbe) ;
}
-------------------------------------
class ChildA
{
       ChildA() ;
       ChildA()~ ;

       ChildA(vector<int> &table):m_t(table){....} ;
       vector<int> &m_t ;
}    

vector<int>がすごっく大きい場合になることがあるので、参照にしたいんですがうまく
いきません。

ガラ 2011/02/25(金) 10:20:54
[[解決]]
ホウジョウウサギさん、レスありがとうございました。
すいません、デフォルトコンストラクタってかならず必要だとおもってました。
けずってもいいんですね。
ありがとうございました。

古いスレッドには追加発言できません。