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

コピーコンストラクタの引数で参照型のメ...
 
通知
すべてクリア

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


ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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

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


返信引用
ホウジョウウサギ
 ホウジョウウサギ
(@ホウジョウウサギ)
ゲスト
結合: 18年前
投稿: 73
 

そもそも 参照型のメンバ変数にまともな参照先を指定せずに
デフォルトコンストラクタを使って
そのクラスのインスタンスを作ることに意味があるのか?という疑問があります.
(どういう挙動になることを期待するのか??)

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

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

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


返信引用
ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

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>がすごっく大きい場合になることがあるので、参照にしたいんですがうまく
いきません。


返信引用
ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

ホウジョウウサギさん、レスありがとうございました。
すいません、デフォルトコンストラクタってかならず必要だとおもってました。
けずってもいいんですね。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました