objects - c++ Error de "tipo incompleto no permitido" al acceder a la información de referencia de la clase(dependencia circular con declaración directa)
how to implement classes in c++ (3)
Esto es lo que tuve y lo que causó mi "error de tipo incompleto":
#include "X.h" // another already declared class
class Big {...} // full declaration of class A
class Small : Big {
Small() {}
Small(X); // line 6
}
//.... all other stuff
Lo que hice en el archivo "Big.cpp", donde declaré que el constructor de A2 con X como parámetro es ...
Big.cpp
Small::Big(X my_x) { // line 9 <--- LOOK at this !
}
Escribí "Small :: Big" en lugar de "Small :: Small" , qué error tan tonto ... Recibí el error "el tipo incompleto ahora está permitido" para la clase X todo el tiempo (en las líneas 6 y 9), que hizo una confusión total ..
De todos modos, ahí es donde puede ocurrir un error, y la razón principal es que estaba cansado cuando lo escribí y necesitaba 2 horas de exploración y reescritura del código para revelarlo.
Tuve algunos problemas en mi código que recientemente rodearon lo que ahora conozco como una dependencia circular. En resumen, hay dos clases, Player y Ball, que necesitan usar información del otro. En algún punto del código se pasará una referencia del otro (de otra clase que incluirá ambos archivos .h).
Después de leerlo, eliminé los archivos # include.h de cada uno y fui con la declaración de avance. Esto resolvió el problema de poder declarar las clases entre sí, pero ahora me queda un "Error de tipo incompleto" cuando intento acceder a una referencia pasada al objeto. Parece que hay algunos ejemplos similares, aunque a menudo combinados con códigos más complejos y difíciles de restringir a los básicos.
He reescrito el código en su forma más simple (un esqueleto esencialmente).
Ball.h:
class Player;
class Ball {
public:
Player& PlayerB;
float ballPosX = 800;
private:
};
Player.h:
class Ball;
class Player {
public:
void doSomething(Ball& ball);
private:
};
Player.cpp:
#include "Player.h"
void Player::doSomething(Ball& ball) {
ball.ballPosX += 10; // incomplete type error occurs here.
}
Cualquier ayuda para entender por qué este es el caso sería muy apreciada :)
Natalie
Si va a colocar sus definiciones en este orden, entonces el código se compilará
class Ball;
class Player {
public:
void doSomething(Ball& ball);
private:
};
class Ball {
public:
Player& PlayerB;
float ballPosX = 800;
private:
};
void Player::doSomething(Ball& ball) {
ball.ballPosX += 10; // incomplete type error occurs here.
}
int main()
{
}
La definición de función doSomething requiere la definición completa de Class Ball porque accede a su miembro de datos.
En su ejemplo de código, Player.cpp no tiene acceso a la definición de la clase Ball, por lo que el compilador emite un error.
Player.cpp
requiere la definición de clase Ball
. Así que simplemente agrega #include "Ball.h"
Player.cpp:
#include "Player.h"
#include "Ball.h"
void Player::doSomething(Ball& ball) {
ball.ballPosX += 10; // incomplete type error occurs here.
}