我有一个类,我正在尝试创建一个友元函数来操作该类的数据。
这是我想要做的一个例子:
// test.hpp
class test
{
public:
friend void friendly_function();
private:
int data;
};
void test::friendly_function()
{
data = 0;
}
但是,编译器会发出错误:test.hpp:23:34: error: no ‘void test::friendly_function()’ member function declared in class ‘test’
我知道我可以用这种方式声明运算符,如下所示:
class test
{
public:
friend const bool operator<(const test& _lhs, const test& _rhs);
private:
int data;
};
const bool test::operator<(const test& _lhs, const test& _rhs)
{
return (_lhs.data < _rhs.data);
}
那么为什么我不能用friendly_function
做到这一点?朋友的功能是否只允许作为运营商使用?
答案 0 :(得分:2)
在我发布这个问题之前,我确实找到了问题,所以给出答案似乎是明智的,因为其他人可能会发现它有用。我也设置了“社区维基”的答案,所以其他人如果愿意可以改进它。
问题是,友元函数不是类的成员,因此必须在没有test::
说明符的情况下进行编码,因为它们不是class test
的成员。
声明friend void friendly_function();
必须在测试类中,因为这告诉编译器允许friendly_function()
访问test
的私有成员。
由于friendly_function()
不是class test
的成员,因此将所有这些代码放在命名空间中是个好主意,命名空间将所有函数和类组合在一个逻辑块中。< / p>
namespace test_ns {
class test
{
public:
friend void friendly_function(test &_t);
friend bool operator<(const test& _lhs, const test& _rhs);
private:
int data;
}; // class test
void friendly_function(test &_t)
{
_t.data = 0;
}
bool operator<(const test& _lhs, const test& _rhs)
{
return _lhs.data < _rhs.data;
}
} // namespace test_ns
那应该解决问题。朋友的功能有点微妙,因为它们可能看起来像成员函数,但实际上并非如此!