Russian Qt Forum
Ноябрь 23, 2024, 21:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: const_cast (случай)  (Прочитано 8233 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 02, 2011, 16:45 »

Мелочь конечно, но для меня оказалось неожиданностью
Код
C++ (Qt)
std::string src("abc");
std::string temp(src);  
char * c = const_cast <char *> (temp.c_str());
*c = 'x';
// Utils::UpCase(c);  // в оригинале
 
Увы, после этого обе строки (temp и src) становятся "xbc"  Улыбающийся
пришлось сделать
Код
C++ (Qt)
std::string temp(src.c_str());  
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 02, 2011, 16:49 »

Странно.
Цитировать
string ( const string& str );
Content is initialized to a copy of the string object str.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 02, 2011, 16:52 »

Странно.
Цитировать
string ( const string& str );
Content is initialized to a copy of the string object str.
Шерит, собака. (gcc 4.2)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 02, 2011, 16:53 »

Пруф дай, а то что-то в http://www.cplusplus.com/ нету.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 02, 2011, 17:16 »

Пруф дай, а то что-то в http://www.cplusplus.com/ нету.
Там говорится, но так "вскольз" что обратить внимание трудно. Легко проверить так
Код
std::string src("abc");
std::string tmp(src);  
qDebug() << (void *) src.c_str() << (void *) tmp.c_str();
 

Edit: печатаем адреса, а не сами строки
« Последнее редактирование: Август 03, 2011, 10:46 от Igors » Записан
zenden
Гость
« Ответ #5 : Август 02, 2011, 19:13 »

Используете грязные хаки, а потом удивляетесь ))

Каждый вправе реализовывать стандарт по-своему
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 02, 2011, 19:16 »

Используете грязные хаки, а потом удивляетесь ))
Ну привет, разве const_cast грязный хак?  Улыбающийся Да и как перевести std::string в upper case (при отсутствии дуста)?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Август 02, 2011, 21:46 »

разве const_cast грязный хак?
Ну разве мы можем не верить Алёне? Смеющийся
Цитировать
Если mutable вполне законное средство убрать константность, у него есть классические применения, то const_cast - это всегда некий хак.
Ну, а если серьёзно, то вы нарушаете инкапсуляцию объекта, поэтому да, это грязный хак.
Записан
Anchorite
Гость
« Ответ #8 : Август 03, 2011, 08:27 »

... Да и как перевести std::string в upper case (при отсутствии дуста)?

Учим матчасть Улыбающийся

Код:
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
    string str = "abcdefghijklmnopqrstuvwxyz";
    cout << "Lower: " << str << endl;

    transform(str.begin(), str.end(), str.begin(), ::toupper);

    cout << "Upper: " << str << endl;

    return 0;
}

« Последнее редактирование: Август 03, 2011, 08:51 от Anchorite » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 03, 2011, 11:14 »

Учим матчасть Улыбающийся
Код:
    transform(str.begin(), str.end(), str.begin(), ::toupper);
Какой Вы быстрый Улыбающийся Но в оригинале Utils::UpCase так сделано только для Вындоуз платформы, а на Mac вызывается нативная UppercaseText. Разбираться почему мне не хотелось, думал проскочить по-быстрому - ведь я сделал копию.

Ну, а если серьёзно, то вы нарушаете инкапсуляцию объекта, поэтому да, это грязный хак.
Конечно нарушаю - и понес заслуженное наказание. Но для меня новостью оказалось что некоторые STL контейнеры также могут шерить данные. 
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Август 03, 2011, 14:51 »

Но для меня новостью оказалось что некоторые STL контейнеры также могут шерить данные.
В C++03 std::string - корова (copy-on-write), причём без требования атомарности, так что в многопоточном приложении возможна «гибель человеческих жертв». Из интересующих нас компиляторов - реализовано в gcc, не реализовано в MSVC ( по крайней мере в 2008- ).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.384 секунд. Запросов: 24.