Полиморфный знак плюс в C ++? - PullRequest
0 голосов
/ 14 сентября 2011

Я понимаю, как полиморфизм и наследование работают в C ++, но моя проблема заключается в следующем: как сделать операторы полиморфными для следующего конкретного примера?

Скажем, у меня есть класс Foo и два экземпляра Foo, fooA и fooB. Я хочу переопределить оператор знака плюс, чтобы "fooA + fooB;" делает что-то конкретное для экземпляров Foo (что бы это ни было). Как бы выглядел прототип функции? Это сбивает с толку, потому что я привык к функциям, начинающимся с буквы ... Любая помощь будет принята с благодарностью.

Кстати, это не домашнее задание, скорее, чудо (я думал о полиморфизме в Ruby).

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

Пример из http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/cplr318.htm:

#include <iostream>
using namespace std;

class complx 
{
      double real, imag;
public:
      complx(double real = 0., double imag = 0.); // constructor
      complx operator+(const complx&) const;      // operator+()
};

// define constructor
complx::complx(double r, double i)
{
      real = r; imag = i;
}

// define overloaded + (plus) operator
complx complx::operator+(const complx& c) const
{
      complx result;
      result.real = this->real + c.real;
      result.imag = this->imag + c.imag;
      return result;
}

int main()
{
      complx x(4,4);
      complx y(6,6);
      complx z = x + y; // calls complx::operator+()
}
3 голосов
/ 14 сентября 2011

const Foo operator+(const Foo& a, const Foo& b) - правильная подпись.Это должна быть дружественная функция, если данные являются частными и не имеют функций-мутаторов (то есть «сеттеров»).

Операторы должны быть глобальными функциями, а не членами, чтобы первый параметр былпо принуждению к вашему типу.Например, если int может быть приведен к Foo, это допустимо с помощью указанной выше подписи: 1 + foo.

Редактировать: код, демонстрирующий, почему оператор + должен быть глобальным ...

struct Foo {
    int i;

    Foo(int i) : i(i) {}

    const Foo operator+(const Foo& a) {
        return Foo(this->i + a.i);
    }
};

int main() {
    Foo f(5);
    f + 1;
    1 + f; // g++ 4.5 gacks here.
    return 0;
}

Вот ошибка:

main.cpp: In function ‘int main()’:
main.cpp:14:9: error: no match for ‘operator+’ in ‘1 + f’
1 голос
/ 14 сентября 2011

Для двоичного файла + вам нужна некоторая форма двойной отправки, которая не поддерживается C ++ из коробки.Есть несколько способов реализации этого, все с различными недостатками.И независимо от того, как вы реализуете саму двойную диспетчеризацию, для n различных производных типов вам потребуется n 2 различных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...