初始化构造函数的最佳方法不仅仅是初始化
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 文件中吗?” 不。只要将它放在任何你喜欢的地方,只要它与构造函数的定义有关。以上是关于初始化构造函数的最佳方法不仅仅是初始化的主要内容,如果未能解决你的问题,请参考以下文章