メンバイニシャライザでのthisの使用について – プログラミング – Home

メンバイニシャライザでのthisの使用...
 
通知
すべてクリア

[解決済] メンバイニシャライザでのthisの使用について


はまち
 はまち
(@はまち)
ゲスト
結合: 24年前
投稿: 146
Topic starter  

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' : ベースメンバ初期化リストで使用されました」
との警告が出てしまいます。このような記述だとどのような問題があるのでしょうか。
みなさんは、このような関連をオブジェクト間で作りたい場合、どうされていますか。
どんたか、お忙しいとは思いますが、お聞かせください。
よろしくお願いします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> BBB::BBB(AAA* pAaa)
> {

この時点で AAA::AAA()がまだ実行されていないため、
pAppのメンバーにアクセスすると予期せぬ問題を引き起こす可能性があります。

その辺りを承知しておけば、このままでも大丈夫でしょう。


返信引用
DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
 

>AAA::AAA():m_member(this)
でなく
AAA::AAA():m_value(this)
だと思いますが、それはともかく、
メンバ初期化リスト実行中は、まだ this でさされる領域が初期化されていないわけで
それを使っちゃっていーの? と警告を発しているのだと思います。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

MSDNでキーワードに『C4355』を入力すると、『'this':ベースメンバ初期化リストで使用され
ました』より詳しい情報が見る事が出来ますよ。


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 24年前
投稿: 146
Topic starter  

みなさん、お返事ありがとうございました

dairygoodsさん、先日はお世話になりました。
今回もとても納得しました。確かに、BBBクラスのコンストラクタで
AAAを使用する場合などは問題が生じそうです。
実は、まさに、BBBクラスのコンストラクタでAAAクラスの
他のデータを参照したいということをしたかったのですが、
これではうまくいかなそうです。
全てのクラスがコンストラクトされたあとで、このデータ
参照を行おうかと思います。

DOSKOI-PANDA さん、確かに、

>AAA::AAA():m_member(this)

は間違いです。確認したはずだったのですが、見落としていました。
にもかかわらず、丁寧な説明。感謝します。

ひろぴー さんもありがとうございました。
実は、私も、ヘルプで見れるかと思って、警告の部分を反転させて
F1キーなどを押していたのですが、キーワードを使うとこのように
見つけることができるのですね。知りませんでした。

知らないことばかりでしたが、皆さん、丁寧に教えていただき
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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