Ошибка LNK2019: неразрешенный внешний символ

Недавно я начал программировать на С++, и для целей обучения я занимаюсь созданием покерной игры. Странная часть, я продолжаю получать следующую ошибку:

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

Я провел некоторое исследование по этой проблеме, и большинство из них указывает на определение конструктора и деструктора в заголовке и .cpp, не соответствующие. Я не вижу никаких проблем с заголовком и .cpp.

Вот код для 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();
    };
}

И код в .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;
    }

};

Ответ 1

Из-за нижеприведенного комментария я переписал то, что у меня было раньше.

Проблема, с которой связывается компоновщик, заключается в том, что вы объявили свои функции-члены в Poker, но не определили их. Как это? Во-первых, вы создаете новый класс и определяете в нем отдельные функции-члены.

Ваш заголовочный файл Poker class существует в пространстве имен PokerGame, а ваш класс cpp Poker существует в глобальном пространстве имен. Чтобы исправить эту проблему, поместите их в одно и то же пространство имен:

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

Теперь, когда они находятся в одном пространстве имен, у вас есть другая проблема. Вы определяете свои функции-члены внутри тела класса, но не первый. Определения просто не могут попасть в тело класса, указанного таким же образом. Избавьтесь от всего класса в файле cpp:

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

    //other definitions
}

Последнее: вы помещаете частную часть своего класса в неправильное место. Именно в этом классе файлов cpp мы просто удалили. Он принадлежит другим частям вашего класса:

//header file
namespace PokerGame {
    class Poker {
    public:
        //public stuff

    private: 
        Deck deck; //moved from cpp file
   };
}

Ответ 2

Другим решением может быть: проверьте файл cmake и убедитесь, что он (например, в ADD_EXECUTABLE) содержит файл .cpp, который вы указали.