错误C2512:没有合适的默认构造函数可用-如果在构造函数中初始化属性,为什么
Error C2512: no appropriate default constructor available - Why if properties are being initialized in constructor?
我已经搜索了很长一段时间,找不到任何与我处境相同的人。如果这是重复的,很抱歉。
我有一个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:"引擎":没有合适的默认构造函数可用
如果属性在构造函数中初始化,为什么好的,我理解Chris关于初始化列表的评论。我该如何评估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创建它们
在成员初始化之前,有一种更好的方法可以进行复杂的处理,而不会使对象的生存期因指针而变得复杂:
struct GameOptions
{
std::string YAMLFilename;
GameOptions(int argc, char** argv);
};
GameOptions::GameOptions(int argc, char** argv)
{
if (argc != 2){
YAMLFilename = defaultYAMLFilename;
logger.logBadParam(argc, fileName);
} else {
YAMLFilename = argv[1];
}
}
Game::Game(GameOptions&& opts) : logger()
, stage(opts.YAMLFilename )
, engine(stage.getWidthPx(),
stage.getHeightPx(),
bitsPerPixel,
stage.getTimeStep())
{
/* remainder of constructor here */
}
并称之为
Game theGame(GameOptions(argc, argv));
甚至
Game theGame({argc, argv});
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如果基类包含双指针成员,则派生类的构造函数
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?
- 为 unordered_map 中的元素设置默认构造函数(如果是 [] 运算符)
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- 如果在C++中不需要构造函数或析构函数,是否有必要显式声明它?
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 如果我们有 (N)RVO,当实际调用移动构造函数时?
- 调用类型的标记构造函数(如果可用),否则为默认值