2016-09-23 240 views
-1

它們是否應該在.cpp.h文件中聲明?應該在哪裏聲明類對象?

實施例1:

A.h 
#include "B.h" 
#include "C.h" 

class A 
{ 
    void someFunction(); 
    B b; 
    C c; 
} 

實施例2:

A.cpp 
#include "B.h" 
#include "C.h" 

A::someFunction() 
{ 
    B b; 
    C c; 
    // Do something with b and c. 
} 

實施例3:

A.cpp 
#include "B.h" 
#include "C.h" 

B b; 
C c; 

A::someFunction() 
{ 
    // Do something with b and c. 
} 

如果它們只能在功能正在使用他們聲明(實施例2)或者它們是否可以在頭文件的頂部聲明,如例3所示?

+0

示例1不是其他兩種的替代方案(實際上所有三種都是完全不同的情況),我也沒有在那裏看到循環依賴。 – user463035818

+0

也許[這些**中的一個](https://stackoverflow.com/search?q=%5Bcpp%5D+circular+dependency)涵蓋了你缺少的東西。你看起來了嗎? – WhozCraig

+0

@ tobi303你能否解釋何時或是否應該使用這些情況? – C3PO

回答

1

這些例子全部都是針對不同的使用情況:

A.h 
#include "B.h" 
#include "C.h" 

class A 
{ 
    void someFunction(); 
    B b; 
    C c; 
} 

這分別增加了對象b和類型BcCA類。任何A類型的對象現在都可以訪問這2個其他對象。 (只是不在課堂之外,因爲他們是隱含的private)。這與示例2 & 3有很大不同,因爲它在實例化A的對象之前並未實際定義任何變量。

例2:

A.cpp 
#include "B.h" 
#include "C.h" 

A::someFunction() 
{ 
    B b; 
    C c; 
    // Do something with b and c. 
} 

這通常是最好的情況時,你只需要使用bcsomeFunction及其變化不必是函數的外部可見。請注意,它們的生命週期直到函數結束。

例3:

A.cpp 
#include "B.h" 
#include "C.h" 

B b; 
C c; 

A::someFunction() 
{ 
    // Do something with b and c. 
} 

這裏,bc都是全局變量,全局通常frowned upon,因爲他們使它很難跟蹤你的代碼的一部分是做什麼修改這些變量。如果他們的生命週期應該是整個程序的話,更好的選擇是將它們傳遞給它們並在main()中定義它們。

+0

如果說,A和B中的函數都在改變C類中成員的值,但是它們所做的更改必須在函數外部可見?我應該在C中使用'static'聲明還是使用b.c.set()? – C3PO

+0

@ C3PO恐怕我們在這裏有一種[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我建議你也許會提出一個新的問題來解決你面臨的實際問題,而不是一些抽象的問題。看起來你只需要通過引用該函數來傳遞一個'C'實例就可以在該函數外部看到更改,但我可能錯了 – user463035818

+0

@ tobi303謝謝。我會看看那個 – C3PO

1

儘可能地用最窄的範圍聲明它們。如果class僅用於單個翻譯單元中,則聲明和將其定義爲它在源文件中。通常,只有聲明 a class在頭文件中,如果聲明是多個轉換單元所需的。

處理循環依賴的正常方式是使用轉發類聲明

相關問題