2010-07-06 75 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++前向声明,朋友功能问题

+0

发生了什么错误? – Anthony 2010-07-06 05:32:32

+2

我已经重申了这个问题。 “朋友”不是最有用的关键字之一。同样,“前向声明”在组合在一个标签中时更有意义。编辑:哦,'class'也更有意义,然后'function'我猜:) – 2010-07-06 05:38:58

回答

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

您需要在A之前申报B。编译器不知道这个:B::frndA()。前向声明没有足够的信息来推断该类型的成员。

我会建议您将您的类A声明放在一个文件A.h中,它的定义在文件A.cpp内。同样,对于相同类型BB.hB.cpp

内部在每一个头文件的顶部放#pragma once(或者,如果你喜欢包括警卫)。

内。然后你B.h你可以简单地包括A.h

+1

事实上,编译一次,可以在同一个文件属于不同的搜索路径中失败,因为它是基于路径上,而不是在文件的内容。所有主要编译器都支持 – 2010-07-06 06:20:14

+0

编译指示。我不认为#pragma曾经保证否决票。在这里看到:http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958 – 2010-07-06 06:25:57

+0

事实上,它的作用。 – 2010-07-07 16:44:13

2

问题是你不能朋友的成员函数编译器已经看到了声明之前。

您将需要重新排列代码以解决问题(即在class A之前移动class B的定义)。