我是c ++的新手,我正在寻找对c ++ 11构造函数的一些问题的深入见解。我听说初始化列表是在构造函数中初始化变量的最佳方法。如果使用和初始化列表,则必须仅在头文件中实现构造函数。我不知道"行业标准"关于这个话题,所以我问你。
构造函数1(Clouds.h)
Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen)
: x(x), y(y), defaultX(x), defaultY(y)
{
cloudSprite.setTexture(texture);
cloudSprite.setPosition(x, y);
};
构造函数2(Clouds.cpp)
Clouds::Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen)
{
Clouds::x = x;
Clouds::y = y;
Clouds::cloudSprite.setTexture(texture);
Clouds::cloudSprite.setPosition(x, y);
}
这种情况可能并不重要,但是有很多旧的内容,我知道你必须小心你所读的内容,这不再适用于c ++ 11.这是其中一个实例吗?
这个问题的出现是因为我在运行时遇到了一个实现错误:
Clouds.h:
Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen)
: x(x), y(y), defaultX(x), defaultY(y) {};
Clouds.cpp:
Clouds::Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen)
{
Clouds::cloudSprite.setTexture(texture);
Clouds::cloudSprite.setPosition(x, y);
}
答案 0 :(得分:6)
您收到该错误,因为您有两个定义。如果要在源文件中写入定义(“out of line”),那么也要将成员初始化列表放在那里。
成员初始化列表没有任何内容意味着您“必须”在头文件中编写整个构造函数定义。
您需要将其放在定义所在的位置,而不是声明所在的位置。
Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen);
// later...
Clouds::Clouds(float x, float y, sf::Texture texture, std::mt19937 randGen)
: x(x), y(y), defaultX(x), defaultY(y)
{
Clouds::cloudSprite.setTexture(texture);
Clouds::cloudSprite.setPosition(x, y);
}