web-dev-qa-db-fra.com

erreur LNK2019: symbole externe non résolu

J'ai récemment commencé à programmer à nouveau en C++ et, à des fins éducatives, 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 le problème, et la plupart indiquent la définition du constructeur et du destructeur dans l'en-tête et le .cpp ne correspond pas. Je ne vois pas de problèmes 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;
    }

};
11
jbenscoter

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 dans Poker, mais que vous ne les avez pas définies. Comment est-ce? Pour commencer, vous créez une nouvelle classe et définissez-y des fonctions de membre distinctes.

Votre classe de fichier d'en-tête Poker existe dans l'espace de noms PokerGame et votre classe cpp de fichier Poker existe dans l'espace de 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
   };
}
8
chris

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é. 

0
qiuqi