2011-09-09 116 views
0

我知道這裏有很多這樣的問題,但我不確定我在做什麼錯誤。我有兩個類,Player和HumanPlayer。 HumanPlayer應該從Player類繼承。當我試圖做的HumanPlayer.cpp文件的建設者和編譯,我得到以下錯誤:無法解析的外部錯誤

錯誤2錯誤LNK1120:1周無法解析的外部

錯誤1個錯誤LNK2001:無法解析的外部符號「公:__thiscall Player :: Player(void)「(?? 0Player @@ QAE @ XZ)

我讀過你需要在派生類的構造函數中顯式調用基類,所以我相信我已經完成了因爲編譯器不會拋出關於它的錯誤。如果有人能指出我的方向正確,那會很棒。我還使用微軟的Visual Studio 2010中

以下是文件中的問題:

//Player.h 
#pragma once 
#include <string> 
using namespace std; 

class Player{ 

public: 
    Player(); 

    Player(const string &); 

    void setName(string); 
    string getName(); 
    void sowSeeds(); 

    void play(); 

private: 
    string name; 
}; 

//Player.cpp 

#include <iostream> 
#include "Player.h" 

using namespace std; 

//constructor 
Player::Player(const string &enteredName){ 
    name = enteredName; 
} 

//HumanPlayer.h 

#pragma once 

#include <string> 
#include "Player.h" 
using namespace std; 

class HumanPlayer : public Player{ 

public: 
    HumanPlayer(); 

    HumanPlayer(const string &); 

private: 

}; 

//HumanPlayer.cpp 

#include <iostream> 
#include "Player.h" 
#include "HumanPlayer.h" 

using namespace std; 

//constructor 
HumanPlayer::HumanPlayer() : Player(){ 

} 

HumanPlayer::HumanPlayer(const string &enteredName) : Player(enteredName){ 

} 

回答

3

你沒有執行不帶參數的構造Player::Player()。並且由於HumanPlayer::HumanPlayer()調用了您從未實現過的構造函數Player::Player(),所以存在一個問題。

+0

非常感謝。我根本沒有看到。添加了構造函數並編譯。 – Cuthbert

0

如果您沒有編譯器會調用默認構造函數(除非使用虛擬繼承),則不需要手動調用基礎構造函數。你只需要實現默認的構造函數Player :: Player()。

1

在Player.cpp中,您需要添加默認構造函數的定義。

Player::Player() 
: name("anonymous-player") 
{} 

但也許你不希望玩家能夠是匿名的,在這種情況下,你應該從Player.h刪除線

Player(); 

。既然你聲明瞭一個接受字符串參數的構造函數,編譯器將不會自動生成Player類的默認構造函數,並且沒有人能夠在不提供玩家名稱的情況下實例化它。

相關問題