非成员函数的问题
An issue with a non-member function
我正在处理的一个问题是要求我在类主体中定义一个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++中,您可以将函数定义为成员函数或非成员函数。如果没有如您所指出的那样指定或要求将函数定义为成员或非成员,那么我会选择简单或简单的解决方案
- 在构造函数中调用非成员函数可能需要使用某种技术来进行此函数调用,现在如果函数被定义为成员函数,则可能不需要这种技术
相关文章:
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题