初始化不仅仅是初始化的构造函数的最佳方法

时间:2017-01-02 15:39:32

标签: c++ c++11 constructor

我是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);
    }

1 个答案:

答案 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);
}