È perfettamente OK passare "questo" o "* questo" come si fa.
Pericoli
Corso della vita:
Un punto circa l'esempio che hai fornito è che si sta chiamando doSth
dal costruttore di ClassA
. L'oggetto che è passato a doSth
è forse un oggetto parzialmente costruita:
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;
};
Ci possono essere problemi se doSth
usi membri che non sono ancora state inizializzate:
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
}
Usando il tipo dinamico dell'oggetto :
Infine, qualsiasi utilizzo del tipo dinamico dell'oggetto (ad esempio chiamate virtuali, dynamic_cast, typeid) avrà risultati diversi su un partiall y oggetto costruito rispetto a un oggetto completo (e in alcuni casi è possibile avere un comportamento non definito).
void ClassB::doSth (ClassA * a) {
if (ClassD * d = dynamic_cast<ClassD *> (a))
{
// Never true when called from ClassA::ClassA
}
}
fonte
2009-12-01 09:30:03
quando si "si" in quel commento, si intende l'oggetto ClassA o l'oggetto ClassB? – Stobor
Qual è esattamente la tua domanda? Cosa ti aspetti e cosa ottieni? – fserb
Hai una domanda o stavi solo condividendo? –