Имеет ли смысл модифицировать объект в целом, используя одно из его поведений? Скажем, внутри оператора присваивания перегрузка с использованием этого указателя? - PullRequest
1 голос
/ 19 января 2011

Я вижу вопрос об этом операторе ( Что означает присвоение * this (* this = val)? )

но логично ли изменять объект целиком из одного его поведения? Имеет ли это смысл в мире ООП?

Ответы [ 4 ]

2 голосов
/ 19 января 2011

Это имеет смысл, когда это имеет смысл с точки зрения дизайна.Например, я ожидаю, что классы Rect, Size и Point будут поддерживать присваивание.В этом смысле эти типы (для меня) должны вести себя как обычные типы данных (POD).

Но если бы я моделировал моделирование движения на легковых и грузовых автомобилях, у меня точно не было бы оператора назначения.Настроить одну машину на равную другую просто не имеет никакого смысла.Я мог бы clone машину (сделать новую, которая будет выглядеть точно так же, как другая), но после создания машины она всегда будет этой машиной.Он не может стать другим видом автомобиля.

В качестве еще одного примера рассмотрим объект Person:

class Person
{
private:
    std::string m_Name;
};

Ожидаете ли вы Personиметь оператор присваивания?Нет. Человек не может стать другим человеком.Однако как насчет его имени?Конечно!Человек может изменить свое имя, поэтому оператор присваивания имени имеет смысл.

Поэтому, чтобы ответить на ваш вопрос, имеет смысл сделать это там, где это имеет смысл:)

0 голосов
/ 19 января 2011

В примере, приведенном в вопросе, с которым вы связаны, просто определяется оператор присваивания в терминах другого, т. Е. Он позволяет присваивать GUID для QUuid и делает это путем простого создания QUuid ииспользуя «обычный» оператор присвоения для QUuid, который принимает в качестве аргумента еще один QUuid.

Так что, да, это имеет смысл.Можно ожидать, что оператор присваивания изменит весь экземпляр.Что касается других функций-членов, если они не названы соответствующим образом, чтобы предполагать, что они выполняют функцию, аналогичную присваиванию, я не ожидал бы увидеть *this =.

0 голосов
/ 19 января 2011

Я не знаю, имеет ли это смысл в ООП, но C ++ - это не чистый ООП, это язык с несколькими парадигмами, и для правильного использования C ++ вы должны понимать его, а не ООП или другие парадигмы.

Функция-член в C ++ - это просто функция с параметром неявного this.(Функциональный член класса A получил параметр A *this неявный .) Затем он неявно передает this другим функциям того же класса.

Функция может затем использовать this так, как она хочет, и это имеет смысл в C ++.

0 голосов
/ 19 января 2011

это полностью зависит от логики вашего кода. изменяя объект «в целом», вы уверены, что не тормозите его инварианты. обычно, если класс предоставляет оператор = ничего плохого в том, чтобы его использовать.

в указанных вопросах это довольно логичный способ вызова перегруженного оператора присваивания, так что это хороший пример.

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