代码之家  ›  专栏  ›  技术社区  ›  Cem Kalyoncu

类命名和命名空间

  •  -1
  • Cem Kalyoncu  · 技术社区  · 15 年前

    在多个命名空间中使用相同的类名会给我带来麻烦吗?我还试图消除对数学库的依赖。你对下面的设计有什么看法?

    第一文件

    #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);
        };
    }
    

    编辑

    这种消除依赖关系的方法怎么样?

    **第一文件**

    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);
        };
    }
    

    事先谢谢。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Matthieu M.    15 年前

    我不认为在不同的名称空间中重用相同的标识符有什么问题,毕竟它们是为其创建的。

    不过,我强烈建议您不要“模拟”包含math::rectangle。如果您需要该文件,那么就将其包含在内,但您所做的操作称为复制/粘贴编程,这会导致大量问题,本质上是因为您的两段代码没有同步,因此一段代码中添加的任何错误修复/功能都不会在另一段代码中报告。

    编辑:对编辑的回答;)

    从评论中看不清楚,因此我将说明:

    如果您需要依赖项(因为您确实使用了所提供的功能),那么您必须包含头部。另一方面,如果您只使用继承来获得具有4个角和几乎没有方法的东西,那么您最好使用最小功能来滚动一个新的矩形类。

    不过,我能想到一个边缘案例。我的印象是,您对功能不太感兴趣,但事实上,您对重用数学库中的方法的可能性很感兴趣,这些方法是为将Math::Rectangle作为参数而定制的。

    根据草本萨特(我认为C++编码标准),与类捆绑的自由函数是类公共接口的一部分。所以如果你想要这些类,你实际上需要继承。


    现在我可以理解,你可能不愿意包括一个可能很大的图书馆(我不知道你的数学图书馆)。在这种情况下,可以考虑将数学库分成两部分:

    • 一个数学形状库,包含基本形状及其作用方法。
    • 一个数学库,其中包含数学图形并添加所有其他内容

    这样你就只能依靠数学图形库了。

    另一方面,如果您绝对不希望依赖项,那么可以直接复制/粘贴,但是通过测试头部保护的存在来测试Math::Rectangle的存在的解决方案不合适:

    • 只有当你正确地得到了头部防护罩,它才起作用。
    • 如果实际执行了include 以前 图形的包含::矩形

    请注意,如果在math::rectangle之前包含graphics::rectangle,则可能存在一些编译问题…

    所以决定你是否需要依赖。

        2
  •  2
  •   Clifford    15 年前

    这恰恰是名称空间的用途,矩形既是一个数学对象,又是一个图形对象。

    但是,避免包含头文件的尝试是非常不明智的。它只会让人头疼。数学变化::矩形 应该 导致对graphics::rectangle的重新生成-如果它们最终出现不匹配,并且您将其隐藏在编译器中,那么最终将出现更难调试的运行时错误。