2011-09-18 42 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類實例的指針或引用,則後者不適用。