Если вам нужно убедиться, что функции друзей могут быть в порядке:
http://www.gotw.ca/gotw/084.htm
К каким операциям требуется доступ
внутренние данные мы бы иначе имели
подарить через дружбу? Это должно
обычно быть членами. (Есть некоторые
редкие исключения, такие как операции
нуждающихся в преобразованиях на их левой руке
аргументы и некоторые как оператор << ()
чьи подписи не позволяют * это
ссылка, чтобы быть их первым
параметры; даже они обычно могут быть
не-друзья реализованы с точки зрения
(возможно, виртуальные) участники, но
иногда это просто
упражнение в искривлении, и они
лучше всего и естественно выражается как
друзья.) </p>
Вы находитесь в лагере "Операции, требующие преобразования на левых аргументах". Если вам не нужен друг и предполагается, что у вас есть неявный конструктор float
для Fixed
, вы можете реализовать его следующим образом:
static inline Fixed operator-(const Fixed &lhs, const Fixed &rhs) {
return lhs.minus(rhs);
}
затем реализует minus
как общедоступную функцию-член, с которой большинство пользователей не будут беспокоиться, потому что они предпочитают оператора.
Я предполагаю, что если у вас есть operator-(float)
, то у вас есть operator+(float)
, поэтому, если у вас нет оператора преобразования, вы можете использовать:
static inline Fixed operator-(float lhs, const Fixed &rhs) {
return (-rhs) + lhs;
// return (-rhs) -(-lhs); if no operator+...
}
Или просто Fixed(lhs) - rhs
, если у вас есть явный float
конструктор. Они могут быть или не быть такими же эффективными, как реализация вашего друга.
К сожалению, язык не собирается наклоняться назад, чтобы приспособиться к тем, кто случайно ненавидит одно из его ключевых слов, поэтому операторы не могут быть статическими функциями-членами и таким образом получать эффекты дружбы; -p