非成员函数的问题

An issue with a non-member function

本文关键字:问题 函数 成员      更新时间:2023-10-16

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

问题是,非成员函数的一个参数的类型为Sound,并且它对类型为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(); }

看起来最好的做法是在函数之前为类使用前向声明

标题:

class Sound;
void f(Sound s);
class Sound
{...};
  • 在c++中,您可以将函数定义为成员函数或非成员函数。如果没有如您所指出的那样指定或要求将函数定义为成员或非成员,那么我会选择简单或简单的解决方案
  • 在构造函数中调用非成员函数可能需要使用某种技术来进行此函数调用,现在如果函数被定义为成员函数,则可能不需要这种技术