私は最近、C++で再びプログラムを開始しました。教育の目的で、ポーカーゲームの作成に取り組んでいます。奇妙な部分は、次のエラーが発生し続けることです:
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
私はこの問題についていくつか調査しましたが、ほとんどがヘッダーと.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;
}
};
以下のコメントのため、以前の内容を書き直しました。
リンカが不満を抱いている問題は、Poker
でメンバ関数を宣言しているが、それらを定義していないことです。これはどのように?手始めに、新しいクラスを作成し、その中に個別のメンバー関数を定義しています。
ヘッダーファイルPoker
クラスは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
};
}
別の解決策としては、cmakeファイルをチェックし、リストにある.cppファイルが含まれていることを確認してください(ADD_EXECUTABLEなど)。