【问题标题】:C++: Differences between using Structs or Enums for overloading constructors?C ++:使用结构或枚举重载构造函数之间的区别?
【发布时间】:2012-11-18 23:54:03
【问题描述】:

我可以使用结构或枚举来重载构造函数,它们似乎都做同样的工作。实际上,从一个更改为另一个甚至在使用每个来区分两个可执行文件时都没有显示任何差异。但是,哪个合适呢?

这个:

enum PointLocalCoord{ local };
enum PointGlobalCoord{ global };

class Point {
    Point( const PointLocalCoord, const int x, const int y )
        {  /* something */  }
    Point( const PointGlobalCoord, const int x, const int y )
        {  /* something else */  }
};

或者这个:

struct local{};
struct global{};

class Point {
    Point( const local, const int x, const int y )
        {  /* something */  }
    Point( const global, const int x, const int y )
        {  /* something else */  }
};

【问题讨论】:

    标签: c++ constructor struct enums overloading


    【解决方案1】:

    两者都不好。您应该具有强语义类型,即使对于相同维度的数量,以及它们之间的转换函数

    struct LocalPoint { int x; int y; };
    struct GlobalPoint { int x; int y; };
    
    LocalPoint getLocal(GlobalPoint const & gp) { /* remainder? */ }
    GlobalPoint getGlobal(LocalPoint const & lp, int offset_x, int offset_y);
    

    现在您可以直接为每个点类型创建构造函数。

    这里的结果是语义点类比两个随机的、无意义的整数要好得多。

    【讨论】:

    • 在这个例子中,你可能是对的。但是在某些情况下,我看不到这是如何工作的,例如避免从派生类构造基类。像这样:枚举 SkipConstructor{ skip_ctor };然后是这样的派生ctor:Derived():Base(skip_ctor){}
    • @zeroth:我不明白你为什么要“避免从派生类构造基类”。从表面上看,这看起来像是一些严重的设计滥用。也许您可以发布一个更具代表性的示例来说明您要解决的问题?
    • 我不得不跳过基类构造的唯一原因是在我的 Matrix 类中。我在 OpenGL 应用程序中有 Mat3x3f 和 Mat4x4f。我永远不需要任何其他维度的矩阵,而 Mat3x3 所做的任何事情,Mat4x4 都以完全相同的方式进行。所以 Mat4x4 继承了 Mat3x3 的所有方法。但是,这意味着基类的数组(它只是堆上的数据成员)需要指向与派生类相同的数据,两者都只有一组数据。要么我允许基类分配内存,然后立即在派生类中删除它,要么我跳过基类中的分配。
    【解决方案2】:

    两者都可以编译,但您应该根据逻辑选择一个。在你的情况下,我认为它应该是 enum,但略有不同:

    enum PointCoordType
    {
        local,
        global
    };
    class Point {
        Point( PointCoordType, const int x, const int y )
            {  /* something */  }
    };
    

    甚至有两种类型的Point 类:

    LocalPoint : Point
    

    GlobalPoint : Point
    

    【讨论】:

    • 在这种情况下,你会在同一个构造函数中对 x 和 y 做一些不同的事情。除非您将它们拆分为构造函数调用的其他方法,否则您将远离“一个函数应该做一件事”的理念。但在这一点上,你还不如只有两个构造函数,而不是一个构造函数加上两个方法函数。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多