我已经寻找了很长一段时间,但找不到与我情况相同的人。抱歉,如果这是重复的。
我有一个 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 */
}
但这不太可能起作用,因为您可能在构造函数内做了一些工作来初始化 fileName
和 bitsPerPixel
。但这就是您遇到的问题。如何解决这个问题取决于您。
每个构造函数都必须为类中的每个字段调用构造函数。如果您不指定哪个构造函数,则它将是默认的。但是,您可以使字段指针指向对象。然后它们可以初始化为 NULL,您可以在构造函数中使用 new 创建它们。
关于c++ - 错误 C2512 : no appropriate default constructor available - Why if properties are being initialized in constructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283429/