2008-12-12 5 views
3

Je construis un jeu et je compilais en voyant quelles erreurs venaient et il y en a un qui est très commun et très énigmatique pour moi:Aide de la syntaxe C++ pour la définition récursive (ou c'est ce que mon compilateur me dit)

1>c:\users\owner\desktop\bosconian\code\bosconian\ship.h(9) : error C2460: 'Ship::Coordinate' : uses 'Ship', which is being defined 

Cela vient également pour la classe SpaceObject et toutes les autres dérivations de celle-ci. La classe Coordinate est simplement une classe de vecteurs 2d et, si cela est important, ne fait référence qu'à une classe Environment.

La classe Environnement référence de la SpaceObject mais je ne crois pas que ce soit un problème (corrigez-moi si je me trompe)

Ceci est mon premier projet à plus grande échelle en C++ et je me demandais si cela pourrait être un erreur de débutant commun avec une solution plus évidente. Si c'est important, la hiérarchie de la classe SpaceObject n'est pas complètement remplie, mais elle est remplie à plusieurs niveaux après les classes SpaceObject et Ship. .
.
.
Modifier: Ceci est en réponse au commentaire.

-Quand je dis référence je veux dire se référer à cette classe dans une autre classe. Comme dans la classe I SpaceObject référence à la classe de coordonnées:
Coordonnée * Position

Environnement fait faire référence à des pointeurs SpaceObject, mais je ne peux pas voir que je ne pouvais pas faire référence à des classes comme ça ... Je veux dire, toutes mes classes doivent se rapporter d'une manière ou d'une autre, non?

En réponse à coller le code, il est assez dur parce qu'ils sont énormes classes, mais voici la ligne l'erreur pointe vers:

public: 
Ship(Coordinate * positionObject_, int direction_, int possibleDirections_, int maxHealth_, Component * objectSectors_, int numOfObjectSectors_, double speed_);//this is the line 
void move();//handles the actual translation of calculated move on the map (i.e. bounds checking) 
+0

Vous avez apparemment un objet Ship (pas une référence ou un pointeur) dans votre classe Coordinate - peut-être via l'environnement? Vous aurez besoin de poster du code, plutôt que juste l'erreur, pour être sûr. –

+0

Pourriez-vous publier le code en plus du message d'erreur? –

+0

que signifie "références"? avez-vous des membres (pas de pointeurs) dans ces classes en tant qu'objets, et pas de références? –

Répondre

12

Vous avez quelque chose comme ceci:

class Ship 
{ 
    class Coordinate 
    { 
     Ship m_ship; 
    }; 

    Coordinate m_coordinate; 
}; 

Le problème est que chaque objet Ship contient comme membre une coordonnée, qui contient en tant que membre un navire, ad nauseum. La taille d'un navire deviendrait infiniment grand si cela était autorisé à continuer. Ce que vous voulez vraiment, c'est remplacer ces variables membres par des pointeurs ou des références - un pointeur/référence a une taille connue (par exemple 4 octets sur une CPU 32 bits), et peut être déclaré sans connaître le type pointé/référé à.

+0

Hmmm ... Je pense que je comprends ce que vous dites. Donc, je suis vraiment limité à l'utilisation de pointeurs (dans la plupart des cas), parce que le compilateur ne peut pas instancier les objets car il ne sait pas combien de mémoire allouer? – Chad

+0

Tchad, oui c'est tout. Penses-y. Un navire a une coordonnée. Mais une coordonnée n'a pas de vaisseau! il est juste connecté à un vaisseau, vous avez donc besoin d'un pointeur. –

+0

J'utiliserais probablement des références au lieu de pointeurs si elles ne vont jamais changer. Je suppose que vous n'aurez jamais besoin de remplacer l'objet de coordonnées d'un vaisseau. –

Questions connexes