2016-06-17 1 views
0

noobie programmeur ici ~Forward erreur de liens

Je suis en train de copier un code de mes diapositives de cours, cependant, les diapositives ne montrent pas la configuration du fichier d'en-tête. Deux classes utilisent l'un l'autre (Agent et IBehaviour), donc sur la récréation j'ai couru dans un include cyclique. J'ai essayé d'utiliser la solution de déclaration directe (dans IBehaviour) pour résoudre mon problème, mais maintenant je reçois une erreur externe non résolue ... '

Je pense que je peux voir mon problème ~ J'ai une fonction qui prend en un pointeur vers un type incomplet dans IBehaviour.h, mais je ne sais pas comment résoudre ce problème.

Toute aide est grandement appréciée. Le code suivant a été condensé dans des fichiers h à des fins de lecture.

Agent.h

#pragma once 
#include "IBehaviour.h" 
#include <list> 

class Agent 
{ 
public: 
    Agent(); 
    ~Agent(); 
    void Update(); 

protected: 
    std::list<IBehaviour*> m_behaviours; 
}; 

Agent::Agent() 
{ 
} 

Agent::~Agent() 
{ 
} 

void Agent::Update() 
{ 
    for (auto iter = m_behaviours.begin(); iter != m_behaviours.end(); iter++) 
     (*iter)->Update(this); 
} 

IBehaviour.h

class Agent; 

class IBehaviour 
{ 
public: 
    IBehaviour(); 
    ~IBehaviour(); 

    virtual void Update(Agent* pAgent); 
}; 

IBehaviour::IBehaviour() 
{ 
} 


IBehaviour::~IBehaviour() 
{ 
} 

void IBehaviour::Update(Agent * pAgent) 
{ 
} 

SeekB

#pragma once 
#include "IBehaviour.h" 

class SeekB : public IBehaviour 
{ 
public: 
    SeekB(); 
    ~SeekB(); 

    void Update(Agent *pAgent) override; 
}; 

SeekB::SeekB() 
{ 
} 


SeekB::~SeekB() 
{ 
} 

void SeekB::Update(Agent * pAgent) 
{ 
    // Apply seek force to pAgent 
} 

Répondre

0

Comme IBehaviour.h ne traite que d'un pointeur vers la classe Agent et n'a pas d'implémentation utilisant ce pointeur, la déclaration forward est correcte.

Lorsque vous commencez à utilisez ce pointeur, vous devez inclure la déclaration de classe complète plutôt qu'une simple déclaration avant. Je suppose que votre SeekB classe est en utilisant la classe Agent plutôt que de simplement tenir un pointeur, donc vous aurez besoin de #include "Agent.h" dans votre fichier SeekB.h.

Autre que cela, je ne vois pas cyclique inclut dans votre code ...

+0

Bonjour, merci pour votre réponse. J'ai supprimé la classe de recherche tous ensemble. Le problème est entre l'agent et la classe IBehaviour. J'ai essayé de supprimer tous les cycliques comprend, mais le programme compile encore l'habitude ... erreur est: symbole externe non résolu _MAIN référencé dans la fonction « int_cdecl invoke_main (void) » –

+0

peut vouloir (invoke_main @@ YAHXZ?) ajoutez la fonction 'main()' alors. ;-) Sur le plan positif, vous pouvez au moins savoir que vous faites des déclarations avant correctement, après tout! – Mitch

0

Seigneur, aie pitié je n'ai pas une fonction principale. Désolé fam