我正在处理的一个问题是要求我在类体中定义一个istream构造函数。我们打电话给Sound。现在这个构造函数在自己的体中使用了一个函数。但该函数应该是非成员函数。我在另一个文件中定义了它,但我在包含类定义本身的头文件中声明了它。我已将标题放在包含非成员函数的另一个文件中。
问题是,非成员函数的一个参数是Sound类型,它对Sound对象类型执行操作。
当我在头文件中声明这个函数时,如果我把它放在类定义之前,我会收到一个错误,说明对象尚未定义。
当我在定义之后放置声明时,构造函数现在告诉我它内部的函数是未定义的。
如果我将声明放在类体内,它就成了一个成员函数。
问题没有明确说明我不能使该函数成为成员函数所以我想知道是否有办法克服这个catch-22。
答案 0 :(得分:2)
您不一定需要创建函数成员。您可以通过至少两种方式以不同的方式解决它。
问题是如果我理解正确的话,你还没有定义Sound对象。
1)您可以稍微重构一下代码,如下所示。
header
档案:
class Sound
{
public:
Sound();
doStuff();
}
cpp
档案:
void non_member_function(Sound sound)
Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}
void non_member_function(Sound sound) { sound.doStuff(); }
2)如果您坚持上述场景,则在非成员函数之前放置Sound sound
前向声明以获得识别的类型。或者,您可以在类声明之后放置声明。
header
档案:
class Sound
{
public:
Sound();
doStuff();
}
void non_member_function(Sound sound)
cpp
档案:
Sound::Sound() { non_member_function(*this); }
Sound::doStuff() {}
void non_member_function(Sound sound) { sound.doStuff(); }
答案 1 :(得分:1)
看起来最好的事情就是在函数前使用前向声明:
头:
class Sound;
void f(Sound s);
class Sound
{...};
答案 2 :(得分:0)