Перегрузка операторов в C ++ - PullRequest
4 голосов
/ 24 июня 2011

У меня есть сомнения, можем ли мы сделать следующее или нет.

Предположим, я создал два экземпляра класса A, т.е. obj1 и obj2, а класс A имеет функцию-член show().

Могу ли я использовать следующее?

(obj1+obj2).show()

Если да, то как? Если нет, то почему это невозможно?

Ответы [ 7 ]

8 голосов
/ 24 июня 2011

Да, это возможно, просто реализуйте оператор + для A и пусть он возвращает класс типа A:

#include <iostream>

class A
{
public:
    explicit A(int v) : value(v) {}

    void show() const { std::cout << value << '\n'; }

    int value;
};

A operator+(const A& lhs, const A& rhs)
{
    A result( lhs.value + rhs.value );
    return result;
}

int main()
{
    A a(1);
    A b(1);

    (a+b).show(); // prints 2!

    return 0;
}
2 голосов
/ 24 июня 2011

Да, вы можете использовать его, если вы перегрузили оператор + для class A, чтобы вернуть объект class A.

2 голосов
/ 24 июня 2011

Если obj1 + obj2 действительно возвращает объект, который имеет член функции show (), то да, это возможно.

Если нет, это не так.

Итак, это зависит отоператор + функция, которая используется здесь, зависит от обоих типов obj1 и obj2.

obj1 + obj2 - это выражение, имеющее тип, тип объекта, возвращаемого операцией, как любое выражение.Теперь, когда выражение выполнено, у вас есть этот объект.Но поскольку здесь вы не связываете его с именем (например, с помощью присваивания), оно является «временным», то есть оно будет уничтожено в конце полного выражения.

Итак, если результирующий тип временного объекта предоставляет функцию show (), вы можете вызывать ее, как и вы.

Если он не предоставляет функцию show (), то вы пытаетесь вызвать функцию, которая не существует.

Так что в любом случае компилятор остановит вас, это не будет ошибкой во время выполнения.

Я был бы вами, я бы настроил минимальный тестовый проект, чтобы просто поиграть с этими принципами.

2 голосов
/ 24 июня 2011

Вы можете сделать это, если перегрузите оператор + таким образом, что он принимает два аргумента типа A и выдает объект, у которого есть метод с именем show.

1 голос
/ 24 июня 2011

Напишите перегрузку оператора для оператора + и определите нужную операцию для этого оператора.

В операторе перегрузки для оператора + просто обновите нужную логику, например, добавление отдельных переменных-членов или объединение имен и т. Д. Со смыслом.в зависимости от вашего варианта использования

Затем вы можете вызвать эту новую функцию object.Show () точно так же, как объект, вызывающий функцию-член.

0 голосов
/ 24 июня 2011

Нет! Результат (obj1 + obj2) не является объектом. Вы можете перегрузить "=" и использовать:

obj3 = obj1 + obj2;
obj3.show();
0 голосов
/ 24 июня 2011

Зависит от того, что является типом результата obj1+obj2 и является ли .show() постоянным методом.

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