Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2 вида функций const и обычная. Как избежать дублирования кода? 
V
    Опции темы
Alek86
Дата 11.8.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

добавлено:

понял уже. хитрый прием, не знал. теперь тему можно закрывать


Это сообщение отредактировал(а) Alek86 - 11.8.2007, 16:13


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.8.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата

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

Вообще компилятор и сам умеет за этим следить, поэтому он будет сильно против, если попытаться получить неконстантный указатель на данные константного объекта. То-есть нельзя возвращать обычный указатель на данные объекта из константной ф-ии. Так-же не получится вызвать неконстантную ф-ю для константного объекта, так-что всё логично, без перегрузки не обойтись, по другому не получится сделать, если конечно нужно создавать константные объекты.
PM MAIL Skype GTalk   Вверх
Rapalex
Дата 23.5.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: нет
Всего: 8



Всем спасибо.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Alek86
Дата 23.5.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



 smile 
 smile 


--------------------
user posted image    user posted image
PM MAIL   Вверх
d06osipov
Дата 23.5.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Зато так вы не сможете избежать ошибок в самой процедуре. Если вы используете const_cast информация о константности теряется и компилятор уже не может проследить, чтобы ваша функция не модифицировала класс.

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

Я бы на вашем месте не использовал const_cast без необходимости. Лучше всего, мне кажется дублирование кода, но если очень не хочется, можно обратится к препроцессору, например так:
Код

#define CONST_PROC(head,body) head body const head const body


И использовать это так:
Код

CONST_PROC(inline int& GetZ(void),\
{\
    return (const_cast<CZ&> (*this)).GetZ();\
} \
)

хотя тут тоже уйма недостатков
PM MAIL   Вверх
Alek86
Дата 23.5.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

вот так вот меняются взгляды... )


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 23.5.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(d06osipov @  23.5.2008,  19:43 Найти цитируемый пост)
Лучше всего, мне кажется дублирование кода, но если очень не хочется, можно обратится к препроцессору, например так:

сколько людей, столько мнений. Я считаю что макросы - зло.


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 24.5.2008, 12:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(d06osipov @  23.5.2008,  18:43 Найти цитируемый пост)
Зато так вы не сможете избежать ошибок в самой процедуре. Если вы используете const_cast информация о константности теряется и компилятор уже не может проследить, чтобы ваша функция не модифицировала класс.

Достаточно выражать неконстантную функцию через константную, и таких ошибок не будет.

Цитата(d06osipov @  23.5.2008,  18:43 Найти цитируемый пост)
но если очень не хочется, можно обратится к препроцессору, например так

Мсье знает толк в извращениях. При юзании твоего макроса как минимум появится проблема с использованием запятых в теле функции.

Это сообщение отредактировал(а) UnrealMan - 24.5.2008, 12:10
PM MAIL   Вверх
JackYF
Дата 25.5.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  24.5.2008,  11:08 Найти цитируемый пост)
Достаточно выражать неконстантную функцию через константную, и таких ошибок не будет.

Если константная функция вернёт мне const T, то мне ничего не остаётся, как сделать const_cast<T&>(...), чтобы вернуть то, что должна возвратить неконстантная функция. Другое дело, что это как раз очень безобидное применение const_cast.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 25.5.2008, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  25.5.2008,  01:02 Найти цитируемый пост)
это как раз очень безобидное применение const_cast. 

Дык об этом и речь. Некоторые люди очень любят катить совершенно пустые бочки на const_cast, reinterpret_cast, макросы и т.д.
PM MAIL   Вверх
korian
Дата 20.3.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



интересует мнение по поводу такой реализации const / не const геттеров, чтобы избежать дублирования кода.
(мнения тех, кто считает std::vector ошибкой проектирования не интересуют)
Код

class MyClass
{
public:
   SomeData *GetValue() {return GetValueImpl<MyClass, SomeData>(*this);}
   const SomeData *GetValue() const {return GetValueImpl<const MyClass, const SomeData>(*this);}

private:
   template<class SelfType, class ResultType>
   inline static ResultType *GetValueImpl(SelfType &self)
   {
        //реализация
   }
}


Это сообщение отредактировал(а) korian - 20.3.2009, 13:18
PM   Вверх
mes
Дата 20.3.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(korian @  20.3.2009,  12:16 Найти цитируемый пост)
интересует мнение по поводу такой реализации const / не const геттеров, чтобы избежать дублирования кода.

имхо извращение smile



--------------------
PM MAIL WWW   Вверх
korian
Дата 20.3.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



ну
Код

  const SomeData *GetValue() const {return const_cast<MyClass *>(this)->GetValue();}
имху тоже извращение  smile 
вопрос какой извращение лучше

PM   Вверх
mes
Дата 20.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(korian @  20.3.2009,  13:28 Найти цитируемый пост)


Код

  const SomeData *GetValue() const {return const_cast<MyClass *>(this)->GetValue();}

имху тоже извращение  smile 
вопрос какой извращение лучше

имхо с const_cast, только в обратном виде, чем в цитате.


Это сообщение отредактировал(а) mes - 20.3.2009, 15:25


--------------------
PM MAIL WWW   Вверх
korian
Дата 20.3.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(mes @  20.3.2009,  14:20 Найти цитируемый пост)
имхо с const_cast, только в обратном виде, чем в цитате

в обратном виде - это так?
Код

SomeData *GetValue()
{
   const MyClass &self = *this;
   return const_cast<SomeData *>(self.GetValue());
}

а чем так лучше?
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.