我正在处理的一个问题是要求我在类体中定义一个istream构造函数。让我们把全班的声音叫做。现在,这个构造函数在自己的主体中使用一个函数。但是这个函数应该是一个非成员函数。我在另一个文件中定义了它,但是在包含类定义本身的标头中声明了它。我已经将标题放置在包含非成员函数的另一个文件中。
问题是,非成员函数的参数之一具有类型声音,它对类型声音对象执行操作。
当我在头文件中声明这个函数时,如果我把它放在类定义之前,就会得到一个错误,说明对象还没有定义。
当我将声明放在定义之后时,构造函数现在告诉我,它体内的函数是未定义的。
如果我将声明放入类体中,它将成为一个成员函数。
这个问题并没有明确说明我不能让这个函数成为一个成员函数,所以我想知道是否有一种方法可以克服这个捕获-22。
发布于 2013-08-30 15:54:32
看起来最好的方法是在函数之前为类使用前向声明:
标题:
class Sound;
void f(Sound s);
class Sound
{...};
发布于 2013-08-30 13:53:27
您不一定需要使函数成员。你至少可以有两种不同的方法来解决这个问题。
问题是,如果我正确理解的话,在声音对象还没有被定义的情况下,所有这些都是存在的。
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(); }
发布于 2013-08-30 14:56:50
https://stackoverflow.com/questions/18541925
复制