【问题标题】:Friend Function of Class produces error: "no '___' member function declared"类的朋友函数产生错误:“没有声明'___'成员函数”
【发布时间】:2013-09-02 11:00:00
【问题描述】:

我有一个类,我正在尝试创建一个友元函数来操作该类的数据。

这是我正在尝试做的一个示例:

// 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 来做这件事呢?友元函数是否只允许作为运算符?

【问题讨论】:

    标签: c++ friend access-control friend-function


    【解决方案1】:

    实际上,在发布此问题之前,我设法找出了问题所在,因此给出答案似乎是明智的,因为其他人将来可能会发现它有用。我还将答案设置为“社区 wiki”,因此其他人可以根据需要对其进行改进。

    问题在于友元函数不是类的成员,因此必须在没有test:: 说明符的情况下进行编码,因为它们不是class test 的成员。

    声明 friend void friendly_function(); 但是必须在测试类中,因为这告诉编译器 friendly_function() 被允许访问 test 的私有成员。

    由于friendly_function() 不是class test 的成员,因此最好将所有这些代码放在一个命名空间中,这会将所有函数和类分组到一个逻辑块中。

    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
    

    这应该可以解决问题。 Friend 函数有点微妙,它们可能看起来像成员函数,但实际上并非如此!

    【讨论】:

    • 我知道有人问过这个问题(某处在这个庞大的问题池中),但你真的不必让它 CW。这是一个精心设计的答案,如果您想出问题并想帮助他人,那么获得代表回答您自己的问题是完全可以的。
    • 这不会编译。我仍然收到error: 'data' was not declared in this scope
    • @chris 我不明白。同一个人立即提出错误的问题。 friendly_function 可以访问私有成员,但它需要 OBJECT 才能在非静态成员上执行此操作。这对您有什么帮助?
    • @PetrBudnik,对不起,我正在详细说明答案的布局,并略读了内容并获得了 +1 分,而且他们似乎已经解决了他们的问题作为表明它是正确的。我明白你的意思,这是一个简单的修复。我就加进去。
    • @chris 我不质疑您在 C++ 方面的专业知识 - 我看到您在 SO 上写的内容。事实上,我认为我什至没有资格质疑它。如果你写了一篇关于使用friends、引用标准等的好评论——我会用两只手投票,甚至不读它,因为我知道这将是一个彻底和有用的评论。但我觉得这个问题只是问are operators different from functions in a specific way when you use them as friends,并得意洋洋地宣布no!。他们为什么要这样做?为什么,比如说,friend 声明出现在public 部分?就好像它应该在那里一样具有误导性......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多