2つのクラスAAAとBBBが以下のようになっています。
class AAA
{
private:
BBB m_value;
}
class BBB
{
private:
AAA* m_pointer;
}
クラスAAAはクラスBBBをメンバとして持っており、
クラスBBBはクラスAAAのポインタをメンバとして持っています。
ここで、クラスAAAのメンバイニシャライザでthisを使って以下のようにしました
AAA::AAA():m_member(this)
{
}
BBB::BBB(AAA* pAaa)
{
m_pointer= pAaa
}
これでbuildすると
「warning C4355: 'this' : ベースメンバ初期化リストで使用されました」
との警告が出てしまいます。このような記述だとどのような問題があるのでしょうか。
みなさんは、このような関連をオブジェクト間で作りたい場合、どうされていますか。
どんたか、お忙しいとは思いますが、お聞かせください。
よろしくお願いします。
> BBB::BBB(AAA* pAaa)
> {
この時点で AAA::AAA()がまだ実行されていないため、
pAppのメンバーにアクセスすると予期せぬ問題を引き起こす可能性があります。
その辺りを承知しておけば、このままでも大丈夫でしょう。
>AAA::AAA():m_member(this)
でなく
AAA::AAA():m_value(this)
だと思いますが、それはともかく、
メンバ初期化リスト実行中は、まだ this でさされる領域が初期化されていないわけで
それを使っちゃっていーの? と警告を発しているのだと思います。
MSDNでキーワードに『C4355』を入力すると、『'this':ベースメンバ初期化リストで使用され
ました』より詳しい情報が見る事が出来ますよ。
みなさん、お返事ありがとうございました
dairygoodsさん、先日はお世話になりました。
今回もとても納得しました。確かに、BBBクラスのコンストラクタで
AAAを使用する場合などは問題が生じそうです。
実は、まさに、BBBクラスのコンストラクタでAAAクラスの
他のデータを参照したいということをしたかったのですが、
これではうまくいかなそうです。
全てのクラスがコンストラクトされたあとで、このデータ
参照を行おうかと思います。
DOSKOI-PANDA さん、確かに、
>AAA::AAA():m_member(this)
は間違いです。確認したはずだったのですが、見落としていました。
にもかかわらず、丁寧な説明。感謝します。
ひろぴー さんもありがとうございました。
実は、私も、ヘルプで見れるかと思って、警告の部分を反転させて
F1キーなどを押していたのですが、キーワードを使うとこのように
見つけることができるのですね。知りませんでした。
知らないことばかりでしたが、皆さん、丁寧に教えていただき
ありがとうございました。