objects ejemplo declaring c++ class member

ejemplo - struct c++



C++ misma clase que miembro en clase (3)

Cuando tiene un miembro de un tipo de clase (directamente no es un puntero), la instancia de su clase madre contiene físicamente la instancia contenida.

En este caso, el compilador no puede encontrar el tamaño de la clase clsNode ya que hay un ciclo. Debe contener un clsNode, que debe contener un clsNode, y así sucesivamente.

Tengo una clase que debería tener una clase del mismo tipo que su miembro.

Mi declaración es la siguiente:

class clsNode { private: clsNode m_Mother; public: void setMother(const clsNode &uNode, int index); };

C ++ me dice "El objeto muestra un calificador de tipo que no es compatible con la función de miembro.

No sé dónde me equivoqué.


La razón es que el tipo del miembro m_Mother tiene un tipo incompleto en el punto en que se declara.

Si tú lo piensas. Si hubiera funcionado, crearía un objeto con un objeto dentro con el mismo tipo, que a su vez siempre tiene un objeto del mismo tipo dentro (y así sucesivamente). El objeto tendría, en cierto sentido, un tamaño infinito.

Una solución es mantener un puntero a la clase principal en su lugar.

class clsNode { private: clsNode* m_Mother; public: void setMother(clsNode* uNode){ m_Mother=uNode; } };

Si desea que todos los padres estén siempre vivos durante la vida de sus hijos, podría usar un puntero compartido en lugar de un puntero sin formato.

class clsNode { private: std::shared_ptr<clsNode> m_Mother; public: void setMother(std::shared_ptr<clsNode> uNode){ m_Mother=uNode; } };

Si usa esta solución, originalmente crearía sus objetos con make_shared


No puede tener un miembro del mismo tipo dentro de la clase. El compilador intenta calcular el tamaño del objeto y el tipo de "entra en un bucle". Puedes evitar eso usando la indirección. Por ejemplo, puede almacenar el puntero al nodo madre.

class clsNode { private: clsNode* m_Mother; public: void setMother(const clsNode &uNode, int index); };