2013-05-30 2 views
0

Я работаю над чем-то личным, как упражнение с занятиями. В качестве фона я просто хочу сделать класс для игроков настольной игры, чтобы отслеживать порядок их поворотов, основываясь на некоторых простых вычислениях, используя их статистику.Неразрешенный внешний символ для класса?

класс

Мой плеер включает в себя этот конструктор строку:

Player(string name, int Dex, int Mod, int Lvl, int diceRoll); 

Его личные данные следующим образом:

int Dex, Mod, Lvl; 
string name; 

У меня есть следующие в моей основной функции, и включили iostream и строковых библиотек ,

int rollD; //Will be input by the user 
Player Derek("Derek", 2, 0, 6, rollD); 
//... etc. 

ошибка, что компилятор бросает именно это:

Initiative.obj: ошибка LNK2019: неразрешенный внешний символ «общественность: __thiscall игрока :: (класс станд :: basic_string, класс станд :: 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. Из того, что я могу сказать, это проблема с синтаксисом моего вызова конструктора, хотя я считаю, что это правильно.

Может ли кто-нибудь помочь мне? Я просмотрел другие потоки с ошибками «External Symbol», но, похоже, я не делал то, что вызывало их ошибки, так как мой код очень прост.

Спасибо!

EDIT: Новая ошибка. Я изменил имя своих частных членов в классе, чтобы быть более легко идентифицируемым (например, mDex). Поэтому у меня есть следующее:

Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll) { 
       mName = name; 
     mDex = Dex; 
     mMod = Mod; 
     mLvl = Lvl; 
} 

Теперь моя ошибка в параметре имени строки. Кажется, он определяет имя как тип, а не переменную, и говорит, что мне не разрешено использовать имя типа.

EDIT 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; 
} 
+3

'но я, кажется, не сделал то, что вызвало их ошибки, так как мой код очень прост, вы не реализовали этот метод, не так ли? –

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) – chris

+0

Обновление с помощью редактирования: вы должны использовать списки инициализатора конструктора для инициализации своих членов. – chris

ответ

2

Вы должны реализовать конструктор для 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 

Defined вне класса:

Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll): 
      name_(name), Dex_(Dex), Mod_(Mod), Lv1_(Lv1), diceRoll_(diceRoll) 
{} 

В противном случае компилятор не может найти определение вашего конструктора.

+0

Ooohhh, глупый я! Правильно, поэтому, если у меня нет конструктора, реализованного вне класса, конечно, он не будет определен для основной функции. Благодаря! –

+0

@ user2395694 Да, обратите внимание, что это нормально для определения внутри класса. – taocp

+0

Huh. Теперь он говорит мне, что я не могу использовать «имя типа» в моем определении функции класса. У меня есть параметр для конструктора string name Итак, почему это дает мне эту ошибку? –

Смежные вопросы