2014-10-16 2 views
1

Я хотел бы сделать метод класса как друга вместо того, чтобы создать весь класс. Вот что у меня естьСоздание методов класса в качестве друга

class tar; 
class foo 
{ 
private: 
    int foo_int; 
public: 
    foo(){std::cout << "Constructor\n";} 
    friend void tar::anotherMethod(); 
}; 

class tar 
{ 
    public: 
    void anotherMethod() 
    { 
     foo f;  
     f.foo_int = 13; 
     std::cout << f.foo_int; 
    } 

}; 

Эти ошибки я получаю

error C2027: use of undefined type 'tar' 
error C2248: 'foo::foo_int' : cannot access private member declared in class 'foo' 

Любые предложения о том, что я могу делать неправильно?

+0

[C2027] (http://msdn.microsoft.com/en-us/library/6c2dk0ah.aspx) : 'Тип не может использоваться до тех пор, пока он не будет определен. Чтобы устранить ошибку, убедитесь, что тип полностью определен, прежде чем ссылаться на него. '. –

+0

Я объявил «класс tar» прототипом. Я не могу понять, почему его не выбрали. – MistyD

+0

Это [ссылка] (https://stackoverflow.com/questions/24095071/incomplete-type-in-nested-name-specifier) ​​объясняет это немного лучше. –

ответ

0

В других, чтобы сделать код компиляции, вы можете изменить объявление и определения:

#include <iostream> 

class tar 
{ 
    public: 
    void anotherMethod(); 
}; 

class foo 
{ 
private: 
    int foo_int; 
public: 
    foo(){std::cout << "Constructor\n";} 
    friend void tar::anotherMethod(); 
}; 

void tar::anotherMethod() 
{ 
    foo f;  
    f.foo_int = 13; 
    std::cout << f.foo_int; 
} 
+0

Спасибо за ответ. Я понимаю, что вы переделали это, чтобы распознать тип. Я смущен, почему компилятор в порядке с типом, когда я заменяю 'friend void tar :: anotherMethod();' с 'friend class tar ' – MistyD

+2

@MistyD: Поскольку он знает, что' tar' является классом (вы объявили это раньше), но он не знает, будет ли элемент «tar :: anotherMethod()» до тех пор, пока он не увидит определение функции-члена. –

+0

Спасибо за очищение – MistyD

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