完全可以通過'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上都會有不同的結果y構造的對象比完整的對象(在某些情況下,您可能有未定義的行爲)。
void ClassB::doSth (ClassA * a) {
if (ClassD * d = dynamic_cast<ClassD *> (a))
{
// Never true when called from ClassA::ClassA
}
}
當你在評論中「自己」,你是指ClassA對象還是ClassB對象? – Stobor 2009-12-01 03:34:44
你的問題到底是什麼?你在期待什麼,你有什麼? – fserb 2009-12-01 03:34:50
你有問題嗎,還是剛剛分享? – 2009-12-01 03:34:57