2009-10-04 154 views
-1

在多個命名空間中使用相同的類名會使我陷入麻煩嗎?我也試着去除依賴到數學庫。你怎麼看待下面的設計。類命名和命名空間

第一個文件

#define MATH_RECTANGLE_EXISTS 

namespace math { 

    class Rectangle : Object2D { 
    public: 
     float perimeter(); 
     float area(); 

     float x,y,w,h; 
    }; 
} 

其他文件

#define GRAPHIC_RECTANGLE_EXISTS 

#ifndef MATH_RECTANGLE_EXISTS 
    //is this a good idea to remove dependency? 
    namespace math { 
     class Rectangle { 
     public: 
      float x,y,w,h; 
     } 
    } 
#endif 

namespace graphics { 

    class Rectangle : math::Rectangle { 
    public: 
     void Draw(Canvas &canvas); 

     void Translate(float x, float y); 
    }; 
} 

編輯

怎麼樣這種方法來刪除依賴?

** 1 **文件

namespace common { 
    class Rectangle { 
     float x,y,w,h; 
    }; 
} 

數學庫文件

#define MATH_RECTANGLE_EXISTS 

namespace math { 

    class Rectangle : public common::Rectangle, public Object2D { 
    public: 
     float perimeter(); 
     float area(); 
    }; 
} 

圖形文件

#define GRAPHIC_RECTANGLE_EXISTS 

namespace graphics { 

#ifndef MATH_RECTANGLE_EXISTS 
    class Rectangle : public math::Rectangle { 
#else 
    class Rectangle : public common::Rectangle { 
#endif 
    public: 
     void Draw(Canvas &canvas); 

     void Translate(float x, float y); 
    }; 
} 

在此先感謝。

回答

3

我看不到在不同名稱空間中重複使用相同標識符的問題,畢竟這是他們創建的。

但是,我強烈要求你不要'模擬'包含數學::矩形。如果你需要這個文件然後包含它,但是你所做的就是複製/粘貼編程,並且會導致很多問題,這主要是因爲你的兩段代碼沒有同步,所以任何錯誤修復/功能添加到一個不在另一方報告。

編輯:答案編輯)

它不是從註釋清楚,所以我會說明它:

如果你需要的依賴(因爲你真的可以使用所提供的功能),那麼你必須包含標題。另一方面,如果你只使用繼承來獲得具有4個角並且幾乎沒有方法的東西,那麼你最好使用最小功能來滾動一個新的Rectangle類。

雖然我可以想到一個邊緣案例。我的印象是,你對功能沒有太大的興趣,但實際上對重用Math庫中的方法感興趣,這些方法已經被定製爲將數學::矩形作爲參數。

根據Herb Sutter(我認爲在C++編碼標準中),捆綁在一個類中的免費函數是類公有接口的一部分。所以如果你想要這些類,你實際上需要繼承。


現在我可以理解,你可能有一些不情願包含一個可能很大的庫(我不知道你的數學庫)。在這種情況下,你可以考慮分爲二的數學庫:

  • 一個MathShapes庫,包括基本形狀,並在他們身上充當
  • 數學庫,其中包括MathShapes和方法添加所有其他的東西

這樣你只能依賴MathShapes庫。另一方面,如果你絕對不想依賴,那麼鈍的複製/粘貼將會執行,但是通過測試它的頭部保護的存在來測試Math :: Rectangle的存在的解決方案是不合理的,安裝:

  • ,如果你正確地獲得頭文件保護
  • 如果包括實際執行的包括圖形::矩形
的它只適用

請注意,在Math :: Rectangle之前包含Graphics :: Rectangle的情況下,您可能會遇到一些編譯問題...

因此,請確定是否需要依賴關係。

+0

是的,我意識到這一點,但我不想要兩個庫之間的依賴關係,而我想在它存在時使用它的功能。 – 2009-10-04 16:32:44

+0

我已經更新了這個問題,你能否再次檢查一下,thx。 – 2009-10-04 16:37:45

+1

然後你應該使用某種接口/工廠。如果數學庫可用,則可以從中取出實現,否則將使用替換。 – sdg 2009-10-04 16:38:34

2

這就是命名空間的用途,矩形既是數學對象也是圖形對象。

但是,嘗試避免包含頭文件是非常不明智的。除維護令人頭疼之外,它只能達到目的。數學中的變化::矩形應該會導致重建graphics :: Rectangle - 如果它們以不匹配的方式結束,並且將其從編譯器中隱藏起來,則最終將更難以調試運行時錯誤。