2013-06-17 2 views
4

В настоящее время я читаю книгу о C++ и у нее есть некоторые упражнения. В одном из упражнений предлагается построить два класса, где каждый из них имеет метод друга для другого. Моя нынешняя догадка выглядит следующим образом:Два класса с другими методами в C++

#include <iostream> 

using std::cout; 
using std::endl; 

class Y; 

class X{ 
public: 
    void friend Y::f(X* x); 
    void g(Y* y){cout << "inside g(Y*)" << endl;} 
}; 

class Y{ 
public: 
    void friend X::g(Y* y); 
    void f(X* x) {cout << "inside f(X*)" << endl;} 
}; 

Но мое предположение не компилируется, потому что класс X есть void friend Y::f(X* x); метод декларации. Как я могу решить головоломку? Пожалуйста, дайте мне еще несколько догадок.

+0

Вы уверены, что это точная формулировка текста? –

+0

Книга была написана на английском языке, но была переведена на русский язык, поэтому я не могу быть уверен, что переводчик абсолютно прав. Но эта формулировка достаточно интересна. – gkuzmin

+3

Дубликат http://stackoverflow.com/questions/6310720/declare-a-member-function-of-a-forward-declared-class-as-friend –

ответ

4

Для того, чтобы объявить функцию как друга, компилятор должен был ее увидеть первым, а C++ не позволяет пересылать декларации функций-членов. Поэтому то, что вы пытаетесь сделать, невозможно в том, как вы хотите. Вы можете попробовать использовать метод «passkey» от here.

В качестве альтернативы, вы можете заменить void friend Y::f(X* x); на friend class Y;.

+0

Спасибо за дубликат комментария кстати. – gkuzmin

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