【问题标题】:Unresolved External Symbol for Class?类的未解析的外部符号?
【发布时间】:2013-05-25 10:51:24
【问题描述】:

我正在做一些个人的事情,作为课堂练习。作为背景,我基本上只是想为棋盘游戏的玩家创建一个类,根据使用他们的统计数据进行一些简单的计算来跟踪他们的回合顺序。

我的 Player 类包括这个构造函数行:

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

其私有数据如下:

int Dex, Mod, Lvl;
string name;

我的 main 函数中有以下内容,并包含了 iostream 和字符串库。

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

编译器抛出的错误正是这样的:

Initiative.obj : 错误 LNK2019: 无法解析的外部符号“public: __thiscall Player::Player(class std::basic_string,class 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;
}

【问题讨论】:

标签: c++ types external symbols


【解决方案1】:

你必须实现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)
{}

否则编译器找不到你的构造函数的定义。

【讨论】:

  • 噢,我真傻!是的,所以如果我没有在类之外实现构造函数,当然不会为 main 函数定义它。谢谢!
  • @user2395694 是的,注意可以在类里面定义。
  • 嗯。现在它在我的类函数定义之外告诉我不允许使用“类型名称”。我有作为构造函数字符串名称的参数那么,为什么它会给我这个错误?
  • 完成。错误是字符串名称参数,似乎认为名称是类型而不是参数。
  • @user2395694, &lt;cstring&gt; 用于 C 字符串函数。您是否表示string 驻留在std 中?
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多