2014-03-18 14 views
3

C++有任何其他替代方案來轉發聲明嗎?例如,我有一個使用A級前向聲明是C++程序中的唯一選項嗎?

class B 
{ 
    public: 
    void set_classA_val(A &b); 
}; 

class A 
{ 
    private: 
    int example; 

}; 

是否有任何替代來解決這個問題編譯而不是將A類B類以上的B類?我們有其他的選擇嗎?前向宣言是唯一的解決方案嗎?

+1

的參數聲明中使用精細的類型名稱有什麼不對向前聲明?這就是它們存在的原因... –

+0

您不需要A那個完整的定義。你可以把'A類;'放在它上面,它會很好的編譯。 –

回答

4

是,

如果你不想B之前放置,然後向前聲明是在這種情況下,唯一的解決方案(如果你不想改變B的定義 - 見扎克豪蘭答案其他想法改變B)。沒有什麼不妥。不知何故,來自B的方法需要知道A是什麼(在這種情況下,它是一個類)。或者,編譯器會通過查找定義來找出它,或者您將幫助編譯器進行前向聲明。

1

有幾個選擇,但沒有關於你的目標的更多信息,很難告訴你哪一個是最好的。前向聲明,移動A的定義,並使B模板類是一些選項。假設你熟悉的2前者,後者看起來是這樣的:

template<typename T> 
class B 
{ 
public: 
    set_value(T& t); 
}; 

而且你會使用聲明它的使用:

B<A> ba; 

正如羅提到的,你還可以使函數本身一個模板 - 但使用將取決於B如何使用該參數(例如,如果該類型對於其他函數也是必需的,則最好讓整個班級使用它)。

+2

+1,另外,使該函數成爲模板。 – jrok

+1

@jrok好點,這也會起作用(取決於'B'將如何使用其模板參數)。 –

2

任何名稱應在使用前聲明。如果你不喜歡下面的代碼

class A; 

class B 
{ 
    public: 
    void set_classA_val(A &b); 
}; 

那麼您可以在成員函數set_classA_val

class B 
{ 
    public: 
    void set_classA_val(class A &b); 
};