2013-08-29 5 views
0

У меня есть класс, и я пытаюсь создать функцию друга для работы с данными этого класса.Функция Friend класса создает ошибку: «no '___» функция-член объявлена ​​«

Вот пример того, что я пытаюсь сделать:

// 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? Доступны ли функции друга только в качестве операторов?

ответ

1

Мне действительно удалось выяснить проблему, прежде чем я разместил этот вопрос, поэтому было бы разумно дать ответ, поскольку другие люди могут найти его полезным в будущем. Я также установил ответ на «community 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 

Это должно решить проблему. Функции друга являются довольно тонкими, поскольку они могут выглядеть как функции-члены, но на самом деле это не так!

+0

Я знаю, что это было задано (* где-то в этом огромном пуле вопросов), но вам действительно не нужно было делать это CW. Это хорошо продуманный ответ, и это прекрасно, чтобы получить ответ, отвечающий на ваши собственные вопросы, если вы выясните их и хотите помочь другим. – chris

+0

Это не компилируется. Я все еще получаю сообщение об ошибке: «данные» не были объявлены в этой области » – FDinoff

+0

@chris Я не понимаю. Его спрашивают и ошибочно отвечают ** одним и тем же человеком мгновенно. 'friendly_function' МОЖЕТ получить доступ к закрытым элементам, но для этого не нужно использовать OBJECT для нестатических членов. Как это полезно в любом случае? – lapk

Смежные вопросы