Я могу использовать 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 */ }
};
Ни то, ни другое Вы должны иметь строго семантические типы, даже для величин одного измерения, и функции преобразования между ними:
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);
Теперь вы можете создавать конструкторы для каждого типа точек напрямую.
В результате класс семантической точки намного лучше, чем два случайных, бессмысленных целых числа.
Оба работают в том смысле, что они компилируются, но вы должны выбрать тот, который основан на логике. В вашем случае, я думаю, что это должно быть enum
, но немного отличается:
enum PointCoordType
{
local,
global
};
class Point {
Point( PointCoordType, const int x, const int y )
{ /* something */ }
};
Или даже имея два типа Point
классы:
LocalPoint : Point
а также
GlobalPoint : Point