2012-04-13 96 views
4

我創建了一個名爲ImageLoader的類,用於加載各種圖像格式。對於各種圖像格式,使用某些結構。例如,對於bmp文件,您有一個BITMAPFILEHEADER結構和另外兩個結構。typedef在課堂或外部聲明的結構?

我想知道的是,當我將我的類定義放在頭文件中時,是否將類型定義的結構typedefs作爲類定義的一部分,還是應該在類定義之外單獨定義?

我不確定,因爲如果我只是聲明一個結構變量,這顯然會發生在類中,但是因爲我定義了一個類型,我不確定它是否被認爲是定義類型的好設計在課堂上。

+4

你爲什麼在C++中對結構體使用typedef?您可以使用結構的名稱。 – 2012-04-13 16:56:11

+0

因爲我習慣了C而老習慣很難死。 – Legion 2012-04-13 17:22:10

回答

5

我的一般規則是,如果它只與該類一起使用,則在其內聲明(它暗示所有權);否則另行申報。

0

如果typedef邏輯上屬於您正在創建的類中,請將其放入內部;如果它在全球範圍內是有意義的,請將它放在外面。

3

如果你忽略了所有可能的頭文件,那麼你會得到更好的封裝。即使您的類的某些方法需要結構的參數或返回類型,您也可能會得到一個前向聲明。

需要將它放入標題的唯一時間是它是公共接口的一部分。

至於它是否進入課堂,請考慮它是否有用,或者是否完全服從課堂。如果它能夠獨立存在,它可能應該放在它自己的標題中。

1

BITMAPFILEHEADER是在Win32平臺SDK中定義的結構。我不確定我是否理解你對它和你的班級的請求......

一般來說,如果你定義的結構沒有暴露給你的類的客戶端,我會在private你的類的一部分,或在子命名空間Details在你的頭文件,如:

namespace YourCoolLibrary 
{ 
    namespace Details 
    { 
    struct SomeInternalStructure 
    { 
     ... 
    }; 

    } // namespace Details 


    class YourCoolClass 
    { 
    ... 
    private: 
    Details::SomeInternalStructure m_something; 
    }; 

} // namespace YourCoolLibrary 
+0

是的,我知道它存在於win32中,但我將把它移植到非Windows平臺上。我正在重建結構,所以使用它將與它在win32中的使用方式相同。 – Legion 2012-04-13 17:24:09

1

甚至有更多的選擇。如果你把它放在類中,你必須選擇它是公共的,保護的還是私人的,使得類定義對類的每個用戶都可見,只有派生類或沒有其他類。

如果您不需要類定義的詳細信息,我只會將前向聲明放到ImageLoader中以使其更簡單。內部類的完整定義然後進入實現文件。

我的經驗法則是使名稱儘可能地方化,所以如果我在錯誤的地方偶然使用它,編譯器會抱怨。

2

我不會說在一個類中聲明一個類型是壞設計的一個指標。假設你提到的「設計」是指「可讀性」的一些東西,我會堅持一致,堅持用相同的方式表達同樣的關係。

否則,你不會因爲築巢類型的神聖憤怒而被擊倒(考慮到SGI不是悶燒的火山口)。這很適合以上下文爲中心,所以除了根據您的要求定義的內容外,沒有硬性規則和快速規則。

如果客戶端的可訪問性不是問題,我將大部分所有內容都聲明在頭文件的適當範圍內,並且只記錄我的代碼的含義。同樣,這是如果我沒有嚴格的使用/可讀性準則來執行。如果我這樣做,我會和馬克的建議一起去。兩美分:你可以嘗試枚舉圖像類型並使用一個公共結構體來存儲配置數據,這樣你就可以證明把所有其他東西都拉上了門。