我知道有很多这类问题,但我不确定我到底做错了什么。我有两个类,Player和HumanPlayer。 HumanPlayer应该从Player类继承。当我尝试在HumanPlayer.cpp文件中执行构造函数并进行编译时,我收到以下错误:
错误2错误LNK1120:1个未解析的外部
错误1错误LNK2001:未解析的外部符号“public:__thiscall Player :: Player(void)”(?? 0Player @@ QAE @ XZ)
我读到你需要在派生类的构造函数中显式调用基类,所以我相信我已经这样做了,因为编译器没有抛出错误。如果有人能指出我正确的方向,那将是伟大的。我也在使用MS 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){
}
答案 0 :(得分:3)
您没有实现不带参数的构造函数Player::Player()
。由于HumanPlayer::HumanPlayer()
调用了您从未实现过的Player::Player()
构造函数,因此您遇到了问题。
答案 1 :(得分:1)
在Player.cpp中,您需要添加默认构造函数的定义。
Player::Player()
: name( "anonymous-player" )
{}
但也许你不希望玩家能够匿名,在这种情况下你应该删除该行
Player();
来自Player.h的由于您已经声明了一个带有字符串参数的构造函数,因此编译器不会自动生成Player
类的默认构造函数,并且没有人可以在不提供播放器名称的情况下实例化它。
答案 2 :(得分:0)
您不需要手动调用基础构造函数,如果不这样做,编译器将调用默认构造函数(除非使用虚拟继承)。您只需要实现默认构造函数Player :: Player()。