C++ "type incomplet non autorisé" erreur accédant à l'information de référence de classe (dépendance circulaire avec déclaration forward))

Eu quelques problèmes dans mon code récemment entourant ce que je sais, maintenant, comme une dépendance Circulaire. En bref, Il ya deux classes, le Joueur et le ballon, qui ont tous deux besoin d'utiliser des informations de l'autre. Les deux à un moment donné dans le code sera passé une référence de l'autre (d'une autre classe qui inclura les deux .h les fichiers).

après avoir lu dessus, j'ai enlevé le # include.h dossiers de chacun et est allé avec la déclaration d'avance. Cela a résolu la question de pouvoir déclarer les classes dans eachother, mais je suis maintenant laissé avec une "erreur de type incomplet" en essayant d'accéder à une référence passée à l'objet. Il semble y avoir quelques exemples similaires autour, bien que souvent mélangé avec du code plus complexe et difficile à réduire à l'essentiel.

j'ai réécrit le code dans sa forme la plus simple (un squelette essentiellement).

balle.h:

class Player;

class Ball {
public:
    Player& PlayerB;
    float ballPosX = 800;
private:

};

le Joueur.h:

class Ball;

class Player {
public:
    void doSomething(Ball& ball);
private:
};

le Joueur.rpc:

#include "Player.h"

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}

Toute aide comprendre pourquoi c'est le cas, serait grandement appréciée :)

Nathalie

20
demandé sur Quentin 2014-02-13 05:07:20

3 réponses

si vous placez vos définitions dans cet ordre alors le code sera compilé

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 définition de la fonction doSomething exige la définition complète de la balle de classe parce qu'il accède à son membre de données.

dans votre lecteur de module d'exemple de code.cpp n'a pas accès à la définition de Class Ball, donc le compilateur émet une erreur.

16
répondu Vlad from Moscow 2014-02-13 01:19:55

Player.cpp nécessite la définition de Ball classe. Donc simplement ajouter #include "Ball.h"

le Joueur.rpc:

#include "Player.h"
#include "Ball.h"

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}
9
répondu Nima Soroush 2015-04-29 14:30:55

Voici ce que j'avais et ce qui a causé mon incomplet "erreur type":

#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

ce que j'ai fait dans le fichier "Big.cpp", où j'ai déclaré le constructeur A2 avec X comme paramètre est..

Big.rpc

Small::Big(X my_x) { // line 9 <--- LOOK at this !
}

j'ai écrit "Small:: Big" au lieu de"Small::Small", ce qu'est une erreur stupide.. J'ai reçu l'erreur "incomplete type is now allowed" pour la classe X tout le temps (aux lignes 6 et 9), ce qui a causé une confusion totale..

de toute façon, c'est là qu'une erreur peut se produire, et la raison principale est que j'étais fatigué quand je l'ai écrit et j'ai eu besoin de 2 heures d'exploration et de réécriture du code pour le révéler.

1
répondu Casper 2016-12-17 13:13:20