为什么我的类构造函数不能按预期工作?

时间:2013-05-30 13:03:07

标签: c++ class constructor

我的个人项目遇到了一些困难。请参阅以下完整代码:

#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() {

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

Player D("Derek", 2, 0, 6, rollD);

return 0;
}

问题是main中的构造函数定义。该错误告诉我“类型名称是不允许的”,这似乎意味着它将变量“name”标识为类型而不是字符串,尽管我包含了相应的库。

有人可以就如何解决这个问题提出任何建议吗?

2 个答案:

答案 0 :(得分:10)

您将构造函数定义放在main()中。那是违法的。你应该把它放在命名空间范围内。

另请注意,您还使用了constructor initialization list的错误语法:

Player::Player(string name, int Dex, int Mod, int Lvl, int diceRoll) 
    : mName(name), mDex(Dex), mMod(Mod), mLvl(Lvl)
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//  This is how you should write the initialization list
{
}

int main() {
    Player D("Derek", 2, 0, 6, rollD);
    return 0;
}

此外,您还没有在任何地方声明rollD,因此在您修复上面提到的内容后,编译器会为此发出错误。

最后,请记住,有using指令,例如:

using namespace std;

在命名空间作用域被认为是一种糟糕的编程习惯,因为它很容易导致与属于std命名空间的实体发生名称冲突。

答案 1 :(得分:4)

您无法在另一个函数中定义函数(包括构造函数)。只需在全局范围内移动定义或在类定义中将其定义为内联。