C ++:使用Structs或Enums重载构造函数之间的区别?

时间:2012-11-18 23:54:04

标签: c++ constructor struct enums overloading

我可以使用struct或enum来重载构造函数,它们似乎都做同样的工作。事实上,当使用每个可执行文件进行差异化时,从一个变为另一个甚至没有显示任何差异。但是,这是正确的吗?

此:

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 */  }
};

2 个答案:

答案 0 :(得分:1)

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

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

甚至有两种类型的Point类:

LocalPoint : Point

GlobalPoint : Point

答案 1 :(得分: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);

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

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