¿Hay alguna forma de declarar un objeto de una clase antes de que la clase se cree en C++? Pregunto porque estoy tratando de usar dos clases, la primera necesita tener una instancia de la segunda clase dentro de ella, pero la segunda clase también contiene una instancia de la primera clase. Me doy cuenta de que puede pensar que podría entrar en un ciclo infinito, pero en realidad necesito crear una instancia de la segunda clase antes de la primera clase.Declarar un objeto incluso antes de que se cree esa clase
Respuesta
No se puede hacer algo como esto:
class A {
B b;
};
class B {
A a;
};
El problema más obvio es el compilador no sabe cómo grande que tiene que hacer la clase A, debido a que el tamaño de B depende del tamaño de A!
Puede, sin embargo, hacer esto:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
La declaración de clase B como una declaración adelantada permite el uso de punteros (y referencias) a esa clase y sin embargo tener toda la definición de clase.
No se puede declarar una instancia de una clase no definida pero se puede declarar un puntero a una :
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Está tan cerca de lo que quiere: La primera clase contiene la segunda clase, pero la segunda clase (que se creará primero) solo tiene una referencia a la primera clase?
En realidad estoy tratando de hacer lo contrario, donde la primera clase hace referencia a la segunda clase y la segunda clase contiene una instancia de la primera clase. –
Esto se denomina referencia cruzada. Vea here un ejemplo.
Hay an elegant solution usando plantillas.
template< int T > class BaseTemplate {}; typedef BaseTemplate<0> A; typedef BaseTemplate<1> B; // A template<> class BaseTemplate<0> { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate<1> { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Este código funcionará! Entonces, ¿por qué funciona ? La razón tiene que ver con cómo se compilan las plantillas . Las plantillas retrasan la creación de las firmas de la función hasta que realmente utilice la plantilla en algún lugar. Esto significa que ni getA() ni getB() tendrán sus firmas analizadas hasta que después de ambas clases A y B ya hayan sido completamente declaradas. Esa es la magia de este método.
Interesante (aunque contiene varios errores ortográficos). Pero los 'getA' y 'getB' son en realidad fábricas: devuelven nuevas instancias (por valor). Una instancia de A no tiene una B ni una instancia de B tiene una A. – jwfearn
- 1. Declarar una instancia de una clase dentro de esa clase
- 2. ¿Cómo evitar que un objeto se cree en el montón?
- 3. Declarar un objeto antes de inicializarlo en C++
- 4. JPA cree que estoy eliminando un objeto separado
- 5. ¿Es posible crear un objeto sin declarar una clase?
- 6. Se solicita la señal Django - post_init en la instancia de modelo Guardar y antes de que incluso se cree una instancia. ¿Por qué?
- 7. Declarar clases anidadas antes de ser definidas
- 8. declarar propiedad como objeto?
- 9. Llamar a un método de clase desde esa clase
- 10. Mapa de Java, clave = clase, valor = instancia de esa clase
- 11. IllegalArgumentException: objeto no es una instancia de declarar clase
- 12. ¿Puedo hacer que Hibernate cree un objeto a través del método de fábrica?
- 13. Llamar a una función del archivo de clase sin crear el objeto de esa clase
- 14. ¿Los miembros estáticos de una clase ocupan memoria si no se crea ningún objeto de esa clase?
- 15. OCaml: declarar una función antes de definirla
- 16. ¿Tener muchos métodos en una clase aumenta la sobrecarga del objeto de esa clase?
- 17. Java: Usar un actionlistener para llamar a una función en otra clase en un objeto de esa clase
- 18. Javascript: ¿cómo se llama a una función dentro de una clase dentro de esa clase?
- 19. Declarar una clase dentro de un módulo
- 20. Chef, cómo ejecutar una plantilla que crea una secuencia de comandos init.d antes de que se cree el servicio
- 21. Evitar que se llame a un método antes que otro
- 22. declarar sobre proporder clase extendida
- 23. Cree un objeto en el constructor o en la parte superior de la clase
- 24. ¿Cree la aplicación VB6 usando una clase en una DLL, luego cambie esa DLL después de la compilación?
- 25. Declarar un diccionario dentro de una clase estática
- 26. Prioridad de operación en Java. (¿Un objeto instancia y se ejecuta antes de que se actualice la GUI?)
- 27. C++, evitando que se cree una instancia de clase en la pila (durante la compilación)
- 28. Declarar objetos de clase en un archivo de encabezado
- 29. ¿Hay alguna diferencia sustancial entre declarar una clase normalmente versus en un objeto de paquete?
- 30. PHP: declarar una variable de clase a ser un objeto stdClass
... o una referencia a uno: MyClass & rMyObject; –