c++ - 错误 C2512 : no appropriate default constructor available - Why if properties are being initialized in constructor?

标签 c++ constructor attributes

我已经寻找了很长一段时间,但找不到与我情况相同的人。抱歉,如果这是重复的。

我有一个 Game 类,在 Game.h 中定义:

class Game
{
    public:
        Game(int argc, char **argv);
        ~Game();

    private:
        Logger logger;
        Stage stage;
        Engine engine;
};

然后在Game.cpp中:

Game::Game(int argc, char **argv)
{
        // Some code removed for clarity. Consider filename and bitsPerPixel 
        // already defined.

        string fileName;
        if (argc != 2){
            fileName = defaultYAMLFilename;
            logger.logBadParam(argc, fileName);
        } else {
            fileName = argv[1];
        }

        logger = Logger();

        stage = Stage(fileName);

        engine = Engine(stage.getWidthPx(), stage.getHeightPx(), bitsPerPixel, stage.getTimeStep());
}

然后我收到此错误:

game.cpp(7): 错误 C2512: 'WormsModel::Stage' : 没有合适的默认构造函数可用

game.cpp(7): 错误 C2512: 'Engine': 没有合适的默认构造函数可用

为什么属性在构造函数中初始化? 好的,我理解克里斯关于初始化列表的评论。我怎样才能设法评估 argc 以及初始化 Stage 的所有内容?

最佳答案

只要类中有字段,就会有一个不带参数的隐式构造。如果要使用非默认构造函数初始化字段,则必须使用初始化器,如下所示:

Game::Game(int argc, char **argv) : logger(), 
                                    stage(fileName), 
                                    engine(stage.getWidthPx(), 
                                           stage.getHeightPx(), 
                                           bitsPerPixel, 
                                           stage.getTimeStep())
{
     /* remainder of constructor here */
}

但这不太可能起作用,因为您可能在构造函数内做了一些工作来初始化 fileNamebitsPerPixel。但这就是您遇到的问题。如何解决这个问题取决于您。

每个构造函数都必须为类中的每个字段调用构造函数。如果您不指定哪个构造函数,则它将是默认的。但是,您可以使字段指针指向对象。然后它们可以初始化为 NULL,您可以在构造函数中使用 new 创建它们。

关于c++ - 错误 C2512 : no appropriate default constructor available - Why if properties are being initialized in constructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283429/

相关文章:

ruby-on-rails - Rails : Virtual attributes and form values

javascript - 为什么input的属性值=text,而li的属性值=number?

c++ - 使用 __debugbreak() 尝试/捕获

so 中的 C++ 名称修饰

java - 什么时候需要显式调用父类(super class)构造函数?

c# - 为什么允许我在非静态构造函数内为静态只读字段对象定义 SendCompletedEventHandler?

C# 反射和属性 : Bug? 我无法解决这个问题

c++ - boost 间隔与多精度

c++ - 如何做一个真正的strtoul?不会摄入实际的字符串

java - 我应该在声明时还是在构造函数中实例化实例变量?