2011-09-18 21 views
2
#include <stdio.h> 
class B; 

class A; 

class A 
{ 
    int a; 
    friend int B::f(); 
}; 


class B 
{ 
    int b; 
    class A x; 
public: 
    int f(); 
}; 

int B::f() 
{ 
    // ... 
} 

main() 
{ 
    class B b; 
    b.f(); 
} 

ERRORS:不完整的类型的错误,使用朋友时起作用

a.cpp:9: error: invalid use of incomplete type ‘struct B’ 

a.cpp:2: error: forward declaration of ‘struct B’ 

的问题不能通过将B的定义中的前作为 B具有类型A.

的目的对于来解决这个例子使B的朋友类会做,但在 我的真实代码,我有更多的B成员函数(所以我需要替代解决方案)。

最后,有人可以给我一些链接,解释编译器在前向声明,声明和定义中所做的 。

+0

问题是,C++编译器是一个“一遍”的编译器,意思是它不会试图保留它现在无法理解的东西,并在以后尝试解决它,当它有更多信息时这个例子,关于B类)。为什么今天仍然如此,超越了我。无论如何,就我所知,使B成为A的朋友类将会奏效。或者你的意思是你必须允许访问B之外的其他成员功能? – Baltasarq

+0

@Baltasarq:想象根据*之后的内容*编译成相同的代码片段。哪个编译语言具有这个“功能”? – eudoxos

+1

@eudoxos:Java,一个。它的语法需要一个多通道编译器。而另一个C++(但只在一个类中)。例如,'class Foo {public:set_item(int val){item = val;} private:int item;};' –

回答

2

A之前定义B和指针申报A作为B成员数据:

class A; //forward declaration 

class B 
{ 
    int b; 
    A *px; //one change here - make it pointer to A 
public: 
    int f(); 

}; 

class A 
{  
    int a; 
    friend int B::f(); 
}; 

或者,你可以把整个类BA的朋友,这样你就不必将会员数据指针指向A

class B; //forward declaration 

class A 
{  
    int a; 
    friend class B; 
}; 

class B 
{ 
    int b; 
    A x; //No change here 
public: 
    int f(); 

}; 
2

你根本无法做你想做的事情。为了在类A中做出该朋友函数声明,需要在类A的定义之前知道类B的性质。为了使B类包含A类的实例,必须在类B的定义之前知道类A的性质。第二十二条军规。

如果您将类B作为类A的朋友类,则前者不适用。如果修改B以包含指向A类实例的指针或引用,则后者不适用。

相关问题