2010-07-06 3 views
4
#include <iostream> 

class B; 

class A{ 
int a; 
public: 
friend void B::frndA(); 
}; 

class B{ 
int b; 
public: 
void frndA(); 
}; 

void B::frndA(){ 
A obj; 
std::cout << "A.a = " << obj.a << std::endl; 
} 

int main() { 
return 0; 
} 

Когда я пытаюсь скомпилировать этот код, произошла ошибка. Может ли кто-нибудь объяснить, в чем проблема с этим кодомC++ Forward декларация, функция функции друга

+0

Какая ошибка? – Anthony

+2

Я повторил вопрос. 'friend' не является одним из наиболее полезных ключевых слов. Кроме того, 'forward-declaration' имеет больше смысла, когда объединен в один тег. Edit: Oh и 'class' также имеет больше смысла, чем' function', я думаю :) –

ответ

3

Разместите всю декларацию class B ... до class A. Вы еще не объявили B::frndA();.

#include <iostream> 
using namespace std; 

class B{ 
    int b; 
public: 
    void frndA(); 
}; 

class A{ 
    int a; 
public: 
    friend void B::frndA(); 
}; 



void B::frndA(){ 
    A obj; 
    //cout<<"A.a = "<<obj.a<<endl; 
} 

int main() { 
    return 0; 
} 
2

Вы должны поместить декларацию B перед тем A. Компилятор не знает об этом: B::frndA(). В прямом объявлении недостаточно информации, чтобы указать, какие члены имеют тип.

Я бы порекомендовал разместить объявление класса A в файле A.h и его определение внутри файла A.cpp. Точно так же для типа B внутри B.h и B.cpp

В верхней части каждого файла заголовка поместить #pragma once (или, если вы предпочитаете включать охрану).

Внутри вашего B.h вы можете просто включить A.h.

+1

На самом деле, pragma один раз может потерпеть неудачу, когда один и тот же файл попадает в разные пути поиска, поскольку он основан на пути, а не на содержимом файла , –

+0

pragma один раз поддерживается всеми основными компиляторами. Я не думаю, что # прагма однажды оправдывает голосование. См. Здесь: http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958 –

+0

Действительно, это так. –

2

Проблема заключается в том, что вы не можете использовать функцию-член, прежде чем компилятор увидит объявление.

Вам необходимо изменить порядок кода, чтобы решить проблему (т. Е. Переместите определение class B до class A).

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