nat1707828
Tuve algunos problemas en mi código recientemente relacionados con lo que ahora conozco como una dependencia circular. En resumen, hay dos clases, Player y Ball, que necesitan usar información de la otra. A ambos en algún punto del código se les 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 se mezclan con un código más complejo y son difíciles de reducir a lo básico.
He reescrito el código en su forma más simple (esencialmente un esqueleto).
Pelota.h:
class Player;
class Ball {
public:
Player& PlayerB;
float ballPosX = 800;
private:
};
Jugador.h:
class Ball;
class Player {
public:
void doSomething(Ball& ball);
private:
};
Jugador.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 🙂
Si coloca sus definiciones en este orden, 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 la función doSomething requiere la definición completa de la clase Ball porque accede a su miembro de datos.
En su módulo de 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
requieren la definición de Ball
clase. Así que simplemente agregue #include "Ball.h"
Jugador.cpp:
#include "Player.h"
#include "Ball.h"
void Player::doSomething(Ball& ball) {
ball.ballPosX += 10; // incomplete type error occurs here.
}
aleksandar
Esto es lo que tenía 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é el constructor de A2 con X como parámetro es…
Gran.cpp
Small::Big(X my_x) { // line 9 <--- LOOK at this !
}
Escribí “Pequeño::Grande” en lugar de “Pequeño::Pequeño”qué error tan tonto … Recibí el error “ahora se permite el tipo incompleto” para la clase X todo el tiempo (en las líneas 6 y 9), lo que generó 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 necesité 2 horas explorando y reescribiendo el código para revelarlo.
En mi caso fue por un error tipográfico.
yo tenia algo asi
struct SomethingStrcut { /* stuff */ };
typedef struct SomethingStruct smth;
Observe cómo el nombre de la estructura no es el mismo que la definición de tipo.
escribí mal struct
a strcut
.
Mire su código y vea si tiene algunos errores tipográficos.
#include "Ball.h"
en Player.cpp– Ígor Tandetnik
13 de febrero de 2014 a las 1:10