Я работаю над чем-то личным, как упражнение с классами. В качестве фона я просто хочу создать класс для игроков в настольную игру, чтобы отслеживать порядок их ходов, основываясь на некоторых простых вычислениях с использованием их статистики.
Мой класс Player включает эту строку конструктора:
Player(string name, int Dex, int Mod, int Lvl, int diceRoll);
Его частные данные таковы:
int Dex, Mod, Lvl;
string name;
У меня есть следующее в моей основной функции, и я включил библиотеки iostream и string.
int rollD; //Will be input by the user
Player Derek("Derek", 2, 0, 6, rollD);
//... etc.
Ошибка, которую выдает компилятор, именно такова:
Initiative.obj: ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Player :: Player (класс std :: basic_string, класс std :: allocator>, int, int, int, int)» (?? 0Player @@ QAE @ V ? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ HHHH @ Z) ссылка на функцию _main
Я использую Visual Studio 2012. Из того, что я могу сказать, он имеет проблемы с синтаксисом моего вызова конструктора, хотя я считаю, что это правильно.
Может кто-нибудь мне помочь? Я просматривал другие темы с ошибками «Внешнего символа», но, похоже, я не сделал то, что вызвало их ошибки, так как мой код очень прост.
Спасибо!
РЕДАКТИРОВАТЬ: Новая ошибка. Я изменил имя своих личных членов в классе, чтобы их было легче идентифицировать (например, mDex). Итак, у меня есть следующее:
Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll) {
mName = name;
mDex = Dex;
mMod = Mod;
mLvl = Lvl;
}
Теперь моя ошибка в параметре имени строки. Кажется, он определяет имя как тип, а не переменную, и говорит, что мне не разрешено использовать имя типа.
РЕДАКТИРОВАТЬ 2: Полный код ниже.
#include <iostream>
#include <string>
using namespace std;
class Player {
public:
Player(string name, int Dex, int Mod, int Lvl, int diceRoll);
int calcInitiative(int Dex, int Mod, int Lvl);
int sortInitiative(int Init);
int diceRoll;
private:
int mDex, mMod, mLvl;
string mName;
};
int main() {
int rollD; //To be given by the user later.
Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll) {
mName(name), mDex(Dex), mMod(Mod), mLvl(Lvl);
}
Player Derek("Derek", 2, 0, 6, rollD);
return 0;
}
Вы должны реализовать конструктор для Player
,
Определено внутри класса:
class Player{
//...other stuff
Player(string name, int Dex, int Mod, int Lvl, int diceRoll):
name_(name), Dex_(Dex), Mod_(Mod), Lv1_(Lv1), diceRoll_(diceRoll){}
};
//^^^Assume name_ and others are your member variables
Определено вне класса:
Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll):
name_(name), Dex_(Dex), Mod_(Mod), Lv1_(Lv1), diceRoll_(diceRoll)
{}
В противном случае компилятор не сможет найти определение вашего конструктора.
Других решений пока нет …