C ++: Различия между использованием Structs или Enums для перегрузки конструкторов?

Я могу использовать 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 */  }
};

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

Теперь вы можете создавать конструкторы для каждого типа точек напрямую.

В результате класс семантической точки намного лучше, чем два случайных, бессмысленных целых числа.

1

Другие решения

Оба работают в том смысле, что они компилируются, но вы должны выбрать тот, который основан на логике. В вашем случае, я думаю, что это должно быть enum, но немного отличается:

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

Или даже имея два типа Point классы:

LocalPoint : Point

а также

GlobalPoint : Point
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector