Неразрешенная внешняя ошибка - PullRequest
0 голосов
/ 09 сентября 2011

Я знаю, что таких вопросов много, но я не уверен, что именно я делаю неправильно.У меня есть два класса, 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){

}

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Вы не реализовали конструктор Player::Player(), который не принимает аргументов. И поскольку HumanPlayer::HumanPlayer() вызывает конструктор Player::Player(), который вы никогда не реализовывали, у вас есть проблема.

1 голос
/ 09 сентября 2011

В Player.cpp вам нужно добавить определение для конструктора по умолчанию.

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

Но, возможно, вы не хотите, чтобы игрок мог быть анонимным, в этом случае вам следует удалитьстрока

Player();

из Player.h.Поскольку вы объявили конструктор, который принимает строковый аргумент, компилятор не будет автоматически генерировать конструктор по умолчанию для класса Player, и никто не сможет создать его экземпляр без указания имени игрока.

0 голосов
/ 09 сентября 2011

Вам не нужно вызывать базовый конструктор вручную, если вы этого не сделаете, компилятор вызовет конструктор по умолчанию (если только не используется виртуальное наследование).Вам просто нужно реализовать этот конструктор по умолчанию, Player :: Player ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...