2015-07-04 77 views
0

我有A類,它必須實現一些功能。由於實現它們中的一個需要它自己的數據結構,我假設A包含另一個B類,它具有所有需要的數據結構和功能。但是,B也需要使用A的數據結構和功能。我使用了兩個使用前向聲明調用對方的類。但仍然存在問題。例如,我需要使A中的所有數據結構公開,以便B可以訪問它。我嘗試使用朋友類,但是當我將B聲明爲具有實現B的功能的子類的抽象類時,我需要將A的所有數據結構作爲公共的。因爲朋友類不適用於繼承的子類,所以A的所有數據結構都需要公開。這使得我的設計相當混亂。前向聲明的替代方法:兩個相互使用的類

class B; 
class A{ 
protected: 
    int ds[100]; 
    B * b; 
public: 
    a_func(){ 
     b->b_func(); 
    } 
}; 


class A; 
class B{ 
    A * a; 
public: 
    b_func(){ 
     a->a_func(); 
    } 
}; 

class sub_B:public B{ 
public: 
    b_func(){ 
     a->a_func(); 
     a->ds ...; 
    } 
} 

我的問題是:沒有任何替代設計?

我也試圖使一個抽象類和B類實現它的功能,但是,它並沒有在概念上是有意義的建立B的對象,當我想A.

的對象
+3

爲什麼你需要一個替代品?只需移動實現(函數定義)來分離翻譯單元('.cpp'文件)。 –

+0

它在不同的單位。一切都是分開的。但是,使公共的每個數據結構都不是一個好的設計。它看起來並不像A包含B,而B是更小的單元,位於A. – Nargesoo

+0

改爲使用純粹的抽象接口。他們不一定需要公開曝光。可能是這個幫助:[我如何刪除/重構«朋友»依賴聲明正確?](http://stackoverflow.com/questions/27492132/how-can-i-remove-refactor-a-friend-dependency-聲明 - 正確) –

回答

1

你不必提供一個類定義的成員函數的定義:

class A; 
class B; 
class A { 
    // no need for public 
    B * b; 
    void a_funct(void); 
}; 
class B { 
    // no need for public here, too 
    A * a; 
    void b_funct(void); 
}; 
// the following goes in a source file, 
// otherwise you should mark it as inline 
void A::a_funct() { 
    b->b_funct(); 
} 
void B::b_funct() { 
    a->a_funct(); 
} 

注意,上面的代碼僅作爲例子,在其目前的形狀是什麼,但看上不已(遞歸)循環。

+0

如果我不把「公開」,它將是私人的。所以我無法訪問b_func或a_func。 – Nargesoo

+0

是的,所以你的問題不是前向聲明,而是這些類之間的一般耦合。儘管沒有提供更具體的信息,但沒有人能夠幫助你。 –