c ++ “Tipo incompleto no permitido” error al acceder a la información de referencia de clase (dependencia circular con declaración hacia adelante)

3 minutos de lectura

avatar de usuario
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 🙂

  • #include "Ball.h" en Player.cpp

    – Ígor Tandetnik

    13 de febrero de 2014 a las 1:10

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.
}

avatar de usuario
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.

¿Ha sido útil esta solución?