2010-02-17 4 views
1

Howdy. Je travaille sur une mission C++ pour ma classe. Je suis presque fini, mais ne peut pas à comprendre ces erreurs:Erreurs du lieur - Symbole externe non résolu

error LNK2001: unresolved external symbol "public: virtual void __thiscall HasQuarterState::dispense(void)const " ([email protected]@@UBEXXZ) gumball.obj Gumball 
error LNK2001: unresolved external symbol "public: virtual void __thiscall SoldState::turnCrank(void)const " ([email protected]@@UBEXXZ) gumball.obj Gumball 
fatal error LNK1120: 2 unresolved externals C:\School Work\CS 492\Gumball\Debug\Gumball.exe Gumball 

Je suis allé à MSDN et regardé erreur LNK2001, mais a reçu une énorme quantité d'informations, et je crains que je ne peux pas comprendre ce qui ne va pas étant donné mon expérience limitée avec C++ en regardant la page MSDN.

Mais je crois que les problèmes viennent de la façon dont j'ai structuré mon programme. Mon professeur a dit que nous pourrions utiliser un fichier .cpp si nous le voulions aussi, mais je suppose qu'au final je n'en savais pas assez sur Visual Studios/C++ pour faire ce travail. Finalement, j'ai rencontré d'autres problèmes que j'ai dû résoudre en utilisant un fichier .cpp.

Le code/fichier en question est ici: http://codepad.org/LpBeJT2Y

Son un grand désordre ole, mais ce que je l'ai fait:

  • Déclarez une classe nommée GumballMachine (pas de définition)
  • Définir une classe nommée State (qui à son tour a un pointeur vers un GumballMachine)
  • Défini plusieurs autres classes d'état qui héritent de l'état
  • Définir la classe GumballMachine
  • Défini plusieurs fonctions qui ont été exclues des définitions d'origine des autres classes d'état. En effet, ces fonctions reposaient sur des fonctions définies de GumbballMachine et ne fonctionnaient pas tant que les fonctions GumballMachine n'étaient pas définies.
void main()
  • Pour autant que je peux dire (avec ma connaissance limitée de VS/C++), le code semble être bien. Peut-être qu'il y a quelque chose que quelqu'un avec plus d'expérience attraperait. Des conseils sur la façon d'éliminer ce problème?

    Merci pour l'aide.

  • Répondre

    1

    Vous avez déclaré la distribution dans HasQuarterState mais vous ne l'avez pas définie. La fonction n'a pas de corps. De même avec turnCrank dans SoldState.

    +0

    Je pensais que c'était correct? Comme il ne devrait rien faire. Je ne l'ai inclus que parce que VS me donnerait des erreurs si je ne le définissais pas. – Chris

    +1

    Vous devez le déclarer car SoldState est dérivé de State. Tout ce qui est dérivé de l'état doit implémenter toutes les méthodes virtuelles pures qu'il a définies (virtual void foo() = 0). SoldState doit avoir une implémentation à exécuter. Le simple fait de déclarer les mêmes méthodes que l'État n'est pas suffisant. Vous devez les implémenter aussi. –

    +0

    Si vous voulez que la distribution ne fasse rien, remplacez le ";" avec "{}" - de cette façon, c'est à la fois une déclaration et une définition. –

    0

    Dans la classe SoldState, turnCrank n'est pas défini. Changez ceci:
    void turnCrank() const;
    à ceci:
    vide turnCrank() const {Cout < < "une mise en œuvre" < < endl; }

    et de manière similaire pour l'autre fonction.

    Questions connexes