Está perfectamente bien pasar 'esto' o '* esto' como lo está haciendo.
Peligros
por vida:
Un punto sobre el ejemplo que ha suministrado es que usted está llamando doSth
desde el constructor de ClassA
. El objeto que se pasa a doSth
es posiblemente un objeto parcialmente construida:
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;
};
Puede haber problemas si doSth
utiliza miembros que aún no han sido inicializados:
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
}
Utilizando el tipo dinámico del objeto :
Por último, cualquier uso del tipo dinámico del objeto (por ejemplo, llamadas virtuales, dynamic_cast, typeid) tendrá resultados diferentes en un partial y objeto construido que en un objeto completo (y en algunos casos puede tener un comportamiento indefinido).
void ClassB::doSth (ClassA * a) {
if (ClassD * d = dynamic_cast<ClassD *> (a))
{
// Never true when called from ClassA::ClassA
}
}
cuando "sí" en ese comentario, ¿te refieres al objeto ClassA o al objeto ClassB? – Stobor
¿Cuál es exactamente tu pregunta? ¿Qué esperas y qué estás obteniendo? – fserb
¿Tiene alguna pregunta o solo compartió? –