「this」や「* this」を渡すことは間違いありません。
生涯危険性:あなたが与えてきた例について
一つのポイントは、あなたがClassA
のコンストラクタからdoSth
を呼び出しているということです。 doSth
に渡されたオブジェクトは、おそらく部分的に構築されたオブジェクトである:
class ClassC {
public:
ClassC()
: m_c()
{}
int m_c;
};
class ClassA : public ClassC {
public:
ClassA (ClassB & b)
: ClassC()
, m_b (b.doSth (this)) // ClassC constructed
// ClassA members partially init.
{
b.doSth (this); // ClassA members initialized
}
// ...
int m_a;
};
class ClassD : public ClassA {
public:
ClassD(ClassB & b)
: ClassA (b) // Partially init
, m_d()
{
// ClassC and ClassA constructed
// ClassD members initialized
}
int m_d;
};
doSth
がまだ初期化されていないメンバー使用している場合に問題があるかもしれません:オブジェクトの動的な型を使用して
void ClassB::doSth (ClassA * a) {
int i = a->m_c; // OK m_c is initialized
int j = a->m_a; // Not OK, m_a not initialized when called
// from member initialization list.
int k = static_cast<ClassD*> (a).m_d; // Not OK
}
を:
最後に、オブジェクトの動的な使用(例えば、仮想呼び出し、dynamic_cast、typeid)は、partiall (そして場合によっては未定義の動作を持つことができます)。
void ClassB::doSth (ClassA * a) {
if (ClassD * d = dynamic_cast<ClassD *> (a))
{
// Never true when called from ClassA::ClassA
}
}
このコメントの「それ自体」は、ClassAオブジェクトまたはClassBオブジェクトを意味しますか? – Stobor
あなたの質問は何ですか?あなたは何を期待していますか、何を得ていますか? – fserb
あなたに質問がありますか、それとも共有していましたか? –