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

Posted

技术标签:

【中文标题】初始化构造函数的最佳方法不仅仅是初始化【英文标题】:Best way to initialize a constructor that does more than initialize 【发布时间】:2017-01-02 15:39:31 【问题描述】:

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

【问题讨论】:

如果你使用和初始化列表,你必须只在头文件中实现构造函数这是不正确的。是的,尽可能使用初始化列表。第二种语法阅读起来很混乱。 嗯,我有一个“已经实现”的错误,因为在头文件中我必须使用带有初始化列表的空括号。 我添加了让我做一些研究的错误。我发现我的问题是头文件中的,然后在cpp文件中使用了非空构造函数。 【参考方案1】:

您收到该错误是因为您有两个定义。如果您想将定义写入源文件(“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);

【讨论】:

所以如果我使用初始化列表,我也必须将它放入 cpp 文件中? 这绝对有效。你总是在 cpp 文件中使用初始化列表吗? 您的问题不在于初始化列表。问题是你只能有一个定义。通过尝试在头文件中使用它,您正在制作一个定义(而不是通常的声明),当它后来在 cpp 中遇到时,它被认为是重复定义。 我明白我相信。如果我只使用构造函数进行初始化,那么只将它放在 header 中就可以了,但因为那不是我在 cpp 文件中初始化的情况。 @John: “所以如果我使用初始化列表,我还必须将它放入 cpp 文件中吗?” 不。只要将它放在任何你喜欢的地方,只要它与构造函数的定义有关。

以上是关于初始化构造函数的最佳方法不仅仅是初始化的主要内容,如果未能解决你的问题,请参考以下文章

构造函数

C++调用父类的构造函数规则

自定义构造方法

构造函数主要特点

explicit 构造函数

C++初始化列表构造函数VS普通构造函数