簡體   English   中英

在類或外部聲明的typedef結構?

[英]typedef structs declared inside class or outside?

我正在創建一個名為ImageLoader的類,它將用於加載各種圖像格式。 對於各種圖像格式,使用某些結構。 例如,對於bmp文件,您有一個BITMAPFILEHEADER結構和另外兩個。

我想知道的是,當我將我的類定義放在頭文件中時,我是否將類typedefs作為類定義的一部分,或者它們是否應該在類定義之外分開?

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

我的一般規則是,如果它只與該類一起使用,那么在里面聲明它(它意味着所有權); 否則單獨聲明。

如果你從標題中省略所有內容,你會得到更好的封裝。 即使您的類的某些方法需要參數或返回結構類型,您也可能會使用前向聲明。

只有當它是公共接口的一部分時,才需要將它放在標題中。

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

我不會說在類中聲明類型是一個糟糕設計的指標。 假設你提到的“設計”意味着“可讀性”,我會堅持一致,堅持以同樣的方式表達相同的關系。

否則,你不會因為嵌套類型的神聖憤怒而被打倒(考慮到SGI不是一個陰燃的隕石坑)。 這是以環境為中心的,因此除了根據您的要求定義的內容之外,沒有嚴格的規則。

如果客戶端可訪問性不是問題,我將大多數所有內容都聲明在標題中的適當范圍內,並記錄我的代碼的含義。 同樣,如果我沒有嚴格的使用/可讀性指南來強制執行。 如果我這樣做的話,我會選擇馬克的建議。

兩分錢:您可以嘗試枚舉圖像類型並使用一個公共結構來獲取配置數據,這樣您就可以證明在閉門造車中拉出其他所有內容。

BITMAPFILEHEADER是Win32 Platform SDK中定義的結構。 我不確定我是否理解你的要求和你的班級......

通常,如果要定義未向類的客戶端公開的結構,我將在類的私有部分或頭文件中的子命名空間Details中定義它們,例如:

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

  } // namespace Details


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

} // namespace YourCoolLibrary

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

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

我的經驗法則是盡可能將名稱設置為本地名稱,因此如果我在錯誤的位置意外使用它,編譯器會抱怨。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM