error LNK2019: unresolved external symbol

78,066

Because of the comment below, I've rewritten what I had before.

The problem that the linker is complaining about is that you've declared your member functions in Poker, but haven't defined them. How is this? For starters, you're creating a new class and defining separate member functions in it.

Your header file Poker class exists in the PokerGame namespace and your cpp file Poker class exists in the global namespace. To fix that issue, put them in the same namespace:

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

Now that they're in the same namespace, you have another issue. You're defining your member functions inside the class body, but not the first one. The definitions simply can't go in the body of a class named the same way. Get rid of the whole class in the cpp file:

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

    //other definitions
}

One last thing: you put the private section of your class in the wrong spot. It was in that cpp file class that we just removed. It belongs with the other parts of your class:

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

    private: 
        Deck deck; //moved from cpp file
   };
}
Share:
78,066
jbenscoter
Author by

jbenscoter

Updated on August 18, 2022

Comments

  • jbenscoter
    jbenscoter almost 2 years

    I've recently started to program in C++ again, and for the purposes of education, I am working on creating a poker game. The weird part is, I keep getting the following error:

    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
    

    I have done some research on the issue, and most point to the constructor and destructor definition in the header and .cpp not matching. I don't see any issues with the header and .cpp.

    Here is the code for 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();
        };
    }
    

    And the code in the .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;
        }
    
    };
    
  • Raymond Chen
    Raymond Chen over 11 years
    Actually, the problem is that there are two different Poker classes. The one in the header file is inside the PokerGame namespace. The one in the cpp file is in the global namespace. The one in the PokerGame namespace is declared but never defined, which is why you get the unresolved external. (If it were multiply defined, you would have gotten a "multiple definitions" error.)
  • chris
    chris over 11 years
    @RaymondChen, Wow, I didn't take a very long look at it, as it has been a couple months now, but I just noticed that and more. deck isn't even in the header one, and I was thinking about mentioning namespaces in my answer, but completely missed the one in the example. Thanks for that.
  • chris
    chris over 11 years
    @RaymondChen, I rewrote it. It was easier than trying to change/merge that much wrong/new information. I hope I didn't leave anything out now.