2011-08-25 63 views
2

也許它聽起來很愚蠢,但我不知道什麼是最好的方式來處理這個問題:面向對象編程 - 作爲成員的變量或僅作爲全局變量的頭部變量?

我有一個類,例如提供對某個COM端口的訪問。要使用這個,你必須建立一個包含信息的緩衝區。這個緩衝區是作爲一個typedef實現的。現在這個typedef位於類的頭文件中,但不在類中作爲成員。不同的是你可以訪問這個緩衝區的方式(包含頭文件)。 作爲一類成員:

CMyClass::MyBuffer MyBuf; 

或者僅僅位於頭一個全球性的:

MyBuffer MyBuf; 

我有幾個數據我不知道往哪裏放,這樣的行爲一些靜態瓦爾作爲緩衝區中的唯一標識符。所以我們在這裏討論靜態和typedefs。

從技術上講,他們屬於這個班級,因爲沒有這些,你就無法使用它。但使用類名和它的範圍操作符來訪問這些類型的時間要長得多。

這個問題怎麼解決?

回答

1

您不應該避免將某些東西放在屬於某個類的類中,因爲您每次需要訪問該類時都覺得不方便。

+0

另一方面,名稱空間也用於邏輯分組類。 – Jon

+0

命名空間,沒錯,沒想到...... – binaryguy

0

一種可能的解決方案是將類CMyClassMyBuffer放入相關命名空間並使用using指令。例如:

namespace MyNS { 
    class CMyClass 
    { 
     // snip 
    }; 

    typedef blah MyBuffer; 
} 

some_function() 
{ 
    MyNS::CMyClass a; 
    MyNS::MyBuffer b; 
} 

using namespace MyNS; 

some_other_function() 
{ 
    CMyClass a; 
    MyBuffer b; 
} 

這可能是一個可能的解決方案。

1

我猜你正在使用的實際名稱是更具描述性的MyBuffer。緩衝區是否屬於該類,除了被它使用?它在某種程度上取決於在那個特定的類中,並且將一個相同描述的typedef放在不同的類中,行爲有什麼不同?如果另一個類需要類似的東西,那麼相同的typedef會這樣嗎?

在我看來,如果你對上述問題回答「否」,typedef根本不屬於該類;它似乎只被該類使用。將它保持爲全局更有意義,因爲您可能有另一個類使用typedef,但最終會保留MyBuffer在某種程度上與CMyClass相關的含義。

+0

以及緩衝區的存在是因爲那個類。以UART爲例。你需要的是一個保持波特率和有效載荷的typedef結構。所以每個想和這個類交談的人都需要知道這個緩衝區,因爲它是連接這個類的唯一方式。所以它可以被許多類使用。但是如果沒有命名空間或者你沒有放入類中,就不能有另一個具有相同名稱的typedef。 – binaryguy

+0

當然,這個類可以使用typedef(假設它是'std :: vector '),但這並不意味着typedef在某種程度上是固有的。如果您以後想要將這個類抽象爲幾個不同的視圖,或者創建一個這樣的緩衝區的類,該怎麼辦? typedef可能屬於這個類,但我從這個問題或澄清中看不到任何證據 - 它看起來就是用法,在我看來,它應該是非成員。 –