erreur LNK2019: symbole externe non résolu

J’ai récemment commencé à programmer à nouveau en C ++ et, à des fins d’éducation, je travaille à la création d’un jeu de poker. La partie étrange est, je continue à recevoir l’erreur suivante:

1>LearningLanguage01.obj : error LNK2019: unresolved external symbol "public: __thiscall PokerGame::Poker::Poker(void)" (??0Poker@PokerGame@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'pokerGame''(void)" (??__EpokerGame@@YAXXZ) 1>LearningLanguage01.obj : error LNK2019: unresolved external symbol "public: __thiscall PokerGame::Poker::~Poker(void)" (??1Poker@PokerGame@@QAE@XZ) referenced in function "void __cdecl `dynamic atexit destructor for 'pokerGame''(void)" (??__FpokerGame@@YAXXZ) 1>LearningLanguage01.obj : error LNK2019: unresolved external symbol "public: void __thiscall PokerGame::Poker::begin(void)" (?begin@Poker@PokerGame@@QAEXXZ) referenced in function _wmain 1>C:\Visual Studio 2012\Projects\LearningLanguage01\Debug\LearningLanguage01.exe : fatal error LNK1120: 3 unresolved externals 

J’ai fait des recherches sur la question, et la plupart soulignent la définition du constructeur et du destructeur dans l’en-tête et le .cpp ne correspond pas. Je ne vois aucun problème avec l’en-tête et .cpp.

Voici le code pour poker.h:

 #pragma once #include "Deck.h" using namespace CardDeck; namespace PokerGame { const int MAX_HAND_SIZE = 5; struct HAND { public: CARD cards[MAX_HAND_SIZE]; }; class Poker { public: Poker(void); ~Poker(void); HAND drawHand(int gameMode); void begin(); }; } 

Et le code dans le .cpp:

 #include "stdafx.h" #include "Poker.h" using namespace PokerGame; const int TEXAS_HOLDEM = 0; const int FIVE_CARD = 1; class Poker { private: Deck deck; Poker::Poker() { deck = Deck(); } Poker::~Poker() { } void Poker::begin() { deck.shuffle(); } //Draws a hand of cards and returns it to the player HAND Poker::drawHand(int gameMode) { HAND hand; if(gameMode == TEXAS_HOLDEM) { for(int i = 0; i < sizeof(hand.cards); i++) { hand.cards[i] = deck.drawCard(); } } return hand; } }; 

En raison du commentaire ci-dessous, j’ai réécrit ce que j’avais auparavant.

Le problème qui se plaint de l’éditeur de liens est que vous avez déclaré vos fonctions de membre sur Poker , mais que vous ne les avez pas définies. Comment est-ce? Pour commencer, vous créez une nouvelle classe et définissez des fonctions de membre distinctes dans celle-ci.

Votre classe d’en-tête Poker existe dans l’ PokerGame noms PokerGame et votre classe cpp de Poker existe dans l’espace-noms global. Pour résoudre ce problème, placez-les dans le même espace de noms:

 //cpp file namespace PokerGame { class Poker { ... }; } 

Maintenant qu’ils sont dans le même espace de noms, vous avez un autre problème. Vous définissez vos fonctions de membre dans le corps de la classe, mais pas le premier. Les définitions ne peuvent tout simplement pas aller dans le corps d’une classe nommée de la même manière. Débarrassez-vous de toute la classe dans le fichier cpp:

 //cpp file namespace PokerGame { Poker::Poker() { deck = Deck(); //consider a member initializer instead } //other definitions } 

Une dernière chose: vous mettez la section privée de votre classe au mauvais endroit. C’est dans cette classe de fichiers cpp que nous venons de supprimer. Il appartient aux autres parties de votre classe:

 //header file namespace PokerGame { class Poker { public: //public stuff private: Deck deck; //moved from cpp file }; } 

Une autre solution pourrait être: vérifiez le fichier cmake et assurez-vous qu’il (comme dans ADD_EXECUTABLE) inclut le fichier .cpp que vous avez répertorié.