未解决的外部错误

Unresolved externals error

本文关键字:错误 外部 未解决      更新时间:2023-10-16

我知道有很多这类问题,但我不确定我到底做错了什么。我有两个类,Player和HumanPlayer。HumanPlayer应该从Player类继承。当我试图在HumanPlayer.cpp文件中做构造函数并编译时,我得到以下错误:

错误2 LNK1120: 1 unresolved externals

错误1错误LNK2001:未解决的外部符号"public: __thiscall Player::Player(void)"(? ? 0 player@@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){
}

您没有实现不带参数的构造函数Player::Player()。并且由于HumanPlayer::HumanPlayer()调用了您从未实现的Player::Player()构造函数,因此您有问题。

在Player.cpp中,您需要添加默认构造函数的定义。

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

但也许你不希望玩家能够匿名,在这种情况下,你应该删除

Player();
从Player.h

。因为你已经声明了一个构造函数,它接受一个字符串参数,编译器不会自动生成Player类的默认构造函数,没有人能够在不提供玩家名称的情况下实例化它。

您不需要手动调用基构造函数,如果不这样做,编译器将调用默认构造函数(除非使用虚拟继承)。您只需要实现默认构造函数Player::Player()。

相关文章: