【问题标题】:Why Does My Class Constructor Not Work As Expected?为什么我的类构造函数没有按预期工作?
【发布时间】:2013-05-30 13:03:07
【问题描述】:

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

#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.js 中的构造函数定义。该错误告诉我“不允许使用类型名称”,这似乎意味着它将变量“名称”识别为类型而不是字符串,尽管我包含了相应的库。

任何人都可以就我如何解决这个问题提供任何建议吗?

【问题讨论】:

    标签: c++ class constructor


    【解决方案1】:

    您将构造函数定义放在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 命名空间的实体发生名称冲突。

    【讨论】:

    • 啊,哎呀!我想在 in-line 之外定义它,因为最终它会非常复杂,但我忘记了它不能在 main 中。谢谢!参考初始化列表的更正也很有帮助!
    • @user2395694:好的,很高兴它有帮助 :) 如果这解决了您的问题,请考虑在允许时将答案标记为已接受(或其他用户可能更喜欢的任何其他答案)跨度>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-18
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      相关资源
      最近更新 更多