Ответ 1
Чтобы скомпилировать выражение a = b;
, вам нужно либо иметь operator=
в типе a
, который принимает элемент типа b
, либо тип, неявно конвертируемый из b
.
Первый случай исключается, так как operator=
должен быть членом класса, и поскольку вы не можете изменить GLPoint
, вы не можете добавить GLPoint& GLPoint::operator=( GLSize )
.
Второй случай страдает от того же типа проблем. Неявное преобразование из GLSize
в GLPoint
может быть реализовано как неявный конструктор в GLPoint
(исключен) или как член operator GLPoint()
в GLSize
, что требует модификации GLSize
. Конверсии также не могут быть добавлены как свободные функции.
Альтернативы используют синтаксис без оператора, добавляя свободную функцию assign
(или copy
): GLPoint& assign( GLPoint&, GLSize const & )
.
Следующий вопрос - почему вы хотите это сделать. Если дизайнеры GLPoint
и GLSize
не считали, что размер должен быть назначен для точки, то почему вы чувствуете, что они должны быть назначаемыми? В общем, рекомендуется сохранять типы отдельно, поскольку это позволит компилятору обнаруживать ошибки, которые могут возникнуть в вашем коде.
Если вы разрешаете неявные преобразования от GLSize
до GLPoint
, вы можете по ошибке ввести что-то вроде: distance( point1, size2 )
, где вы имели в виду distance( point1, point2 )
, а поскольку есть преобразование, компилятор с радостью будет конвертировать и применять. Затем вы увидите странные результаты, и вы проведете немало приятных отладочных часов, пытаясь определить, где логика неправильная.
Если у домена нет четкого определения того, что означает каждый оператор в этом контексте, я бы избегал перегрузки оператора любой ценой. Будут ли все, кто читает ваш код, сразу понять, что GLPoint(1,2) + GLSize(5)
представляет без сомнения или двусмысленности? Если это не так, если люди будут удивлены или даже сомневаются, то избегайте перегрузки оператора и используйте именованные функции: move_up( GLPoint&, GLSize )
(или любой другой размер + размер означает для вас)