2

我正在处理的一个问题是要求我在类体内定义一个 istream 构造函数。让我们称这个类为 Sound。现在这个构造函数在它自己的主体中使用了一个函数。但是该函数应该是非成员函数。我在另一个文件中定义了它,但我在包含类定义本身的标头中声明了它。我已经将标题放在另一个包含非成员函数的文件中。

问题是,非成员函数的参数之一是 Sound 类型,它对 Sound 类型的对象执行操作。

当我在头文件中声明这个函数时,如果我把它放在类定义之前,我会得到一个错误,说对象还没有被定义。

当我将声明放在定义之后时,构造函数现在告诉我它体内的函数是未定义的。

如果我把声明放在类体内,它就变成了一个成员函数。

问题没有明确说明我不能使函数成为成员函数,所以我想知道是否有办法克服这个 catch-22。

4

3 回答 3

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(); }
于 2013-08-30T21:53:27.060 回答
1

看起来最好的办法是在函数之前对类使用前向声明:

标题:

class Sound;

void f(Sound s);

class Sound
{...};
于 2013-08-30T23:54:32.467 回答
0
  • 在 c++ 中,您可以将函数定义为成员函数或非成员函数。如果没有像您指出的那样指定或要求将函数定义为成员或非成员,那么我会选择一个简单或简单的解决方案。
  • 在构造函数中调用非成员函数可能需要您使用某种技术来进行此函数调用,现在如果函数被定义为成员函数,则可能不需要。
于 2013-08-30T22:56:50.790 回答