2015-02-01 2 views
0

Итак, у меня есть класс с перегруженным оператором postfix ++. Я хочу использовать этот оператор на динамически распределенном объекте, как показано ниже. Тем не менее, я нашел только 2 варианта для этого, и ни один из них не кажется правильным. Я чувствую, что мне не хватает какой-то огромной точки перегрузки оператора или чего-то еще. Есть ли более правильный/элегантный/чистый способ сделать это? Я знаю, что это очень упрямые слова ... Я искал какое-то время, но мои знания о C++ довольно ограничены по сравнению с большинством людей на этих форумах. Благодаря!Вывод указателя на объект для использования перегруженного оператора

Date * today = new Date(); 

today->operator++(); //option 1 

(*today)++; //option 2 

ответ

0

Во-первых, ваши два варианта не эквивалентны. Вариант 1 вызывает префиксную форму оператора ++(), а опция 2 вызывает постфиксную форму. Эквивалентный вариант 2 будет затем

++(*today); 

Вообще, предполагая, что эти операторы класса Date реализованы идиоматический, я предпочел бы эту форму, потому что форма постфикса вводит временную и форму префикса не будет.

Какой изящный или чистый? Это субъективно. У разных людей разные мнения.

Однако в вашем примере используется указатель и динамическое распределение памяти (оператор новый). Это вызывает утечку памяти, если объект явно не выпущен с использованием оператора delete. Во многих рекомендациях на C++, которые активно не поощряются (комментарий: это можно считать хорошей техникой на некоторых других языках программирования, но, как правило, не с C++).

Подход, который я хотел бы использовать, - это просто определить объект типа Date, а не указатель.

Date today; // look ma! This is not a pointer. 

++today; //option 2, but prefix form 

К этому простому изменению, нет необходимости (Явно) разыменований любого указателя и, поскольку существует только одна операция, нет необходимости в дополнительных фигурные скобки для группировки вещей. Это также имеет то преимущество, что объект today будет выпущен неявно, поскольку он выходит из области видимости (например, когда функция возвращается), поэтому этот метод не вводит утечку памяти.

Это упрощает процесс, который можно считать более чистым и элегантным.

+0

Спасибо за ответ! К сожалению, я имел в виду, что эти два утверждения эквивалентны. Да, объявление объекта вместо указателя на динамически выделенный объект сделает оператор более чистым, но не означает ли это, что класс затем выделяется стеку? Я не думаю, что когда-нибудь захочу сделать это –

+0

. Тогда вы можете использовать более критический синтаксис, чем вам нужно, путем введения (в значительной степени) произвольного и ненужного ограничения с 1980-х годов. Есть различия, но выигрыши от стека редко бывают значительными, и вы много отказываетесь от C++, настаивая на динамическом распределении своих объектов на использование кучи. Если необходимо, используйте std :: auto_ptr (до C++ 11) или std :: unique_pointer (из C++ 11). Такой же синтаксис для использования объектов, но они будут автоматически выпущены - потому что auto_ptr/unique_pointer находится в стеке. – Rob

+0

Спасибо, ты оказал огромную помощь. Я бы добавил, если бы у меня был представитель. Причина, по которой я хочу создать свои объекты в куче, заключается в том, что я планирую сделать игру в какой-то момент и хочу избежать переполнения стека. Скажи мне, если это все еще не нужно, если ты не против. Я чувствую, что единственный способ получить из книги выучил C++, а реальный мир C++ - это просто проб и ошибок. Я прочитал «Начиная с C++: от Control Structures through Objects» (книга Gaddis), и я проскальзывал через learncpp.com и собирал мелочи здесь и там. Любые другие предложения? Еще раз спасибо, Роб. –

Смежные вопросы