LINUX.ORG.RU

не обязательно. может быть дружественная функция.

struct Foo {
  friend Foo operator *(const Foo & lhs, const Foo & rhs);
};
Vinick ★★
()
T operator * (A a, B b);
T A::operator * (B b); 
frozenix ★★★
()
Ответ на: комментарий от Google-ch

ну как-то так

struct Foo {
   int val;
   Foo (int v): val(v) {}
   friend Foo operator *(const Foo & l, const Foo & r);
};

Foo operator *(const Foo & l, const Foo &r) {
  return Foo(l.val + r.val);
}

Таким образом можно делать коммутативные операции с простыми типами:

Foo operator *(const Foo & r,int l) {
  return Foo(l+r.val);
}

Foo operator *(int l, const Foo & r) {
  return Foo(l+r.val);
}

int main() {
    Foo f = 10 + Foo(15);
    Foo f1 = Foo(15) + 10;
//...
}

Vinick ★★
()
Ответ на: комментарий от Vinick

лучше так:

class AA
{
	public:
		AA(int a): a_(a) {}
		AA &operator *(const AA a) {
			a_ *= a.a_;
			return *this;
		}
		operator int() {return a_;}
	private:
		int a_;
};

AA operator *(const AA &a, const AA &b)
{
	return AA(a) * b;
}

int main()
{
	AA c = AA(3) * AA(2);
	return c;
}

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Ничего, что у Вас оператор * перегружен как *=?

Нафига в таком ключе понадобился внешний * я вообще не понял, это троллинг?;-)

AIv ★★★★★
()
Ответ на: комментарий от Vinick

Можно все операторы делать внешними, кроме ЕМНИП присваивания, доступа по указателю и new/delete.

AIv ★★★★★
()
Ответ на: комментарий от AIv

да, точно. писал ночью, ошибся. конечно надо *= перегружать, и потом

-return AA(a) * b;
+return AA(a) *= b;

Vinick

чем лучше

тем, что нет друзей. друзья - не сильно хорошо, с т.з. дизайна.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

друзья - не сильно хорошо, с т.з. дизайна.

Если без пуризма, то норм. Если не использовать их там, где без них легко обойтись :) А то получается «чем лучше? чем грузины» (с)

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.