Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.05;
Скачать: CL | DM;

Вниз

Вопрос по синтаксису С++ - конветирование   Найти похожие ветки 

 
VEG ©   (2004-02-06 21:01) [0]

Мне необходимо создать совместимость между char* и string. Можно, конечно, для каждого оператора реализовать нечто подобное inline bool operator == (string is, pchar arg) { return strcmp(is.data(), arg)==0; }, однако мне видится более простое решение. Ведь для char* определены все функции, поэтому для совместимости между char и string необходимо в string обращаться через varname.data();. На мой взгляд, лучше всего написать inline оператор, подставляющий из string значение типа char* или, наоборот, из char* значение типа string. Мне это представляется подобным образом, однако этот код не работает:
inline string operator string (char* ch)
{ // error C2549: user-defined conversion cannot specify a return type
string sOut;
sOut = ch;
return sOut;
}

...или...
inline char* operator char (string st)
{ // error C2549: user-defined conversion cannot specify a return type
char* sOut;
strcpy(sOut, st.data());
return sOut;
}

Каков синтаксис необходим данной функции?


 
Alex Konshin ©   (2004-02-06 22:06) [1]

Я уверен, что CString гораздо ближе к дельфийскому String, чем char*. Для char* есть полный аналог - PChar.
Или я не понял твоей проблемы?


 
Fantasist ©   (2004-02-06 22:36) [2]

Чтобы char* преводилось к твоему string, нужно определить конструктор:
string(const char*){...}

Чтобы string преводилось к char* нужено добавить в string оператор:
inline operator char*(){...}


 
Fantasist ©   (2004-02-06 22:38) [3]

Кстати, а книжки слабо почитать? Слишком много от тебя вопросов по С++, которые описанны почти в любой хорошей книжке. Тебе конечно ответять, но по ответам ты узнаешь меньше, чем тебе расскажут в книге.


 
Suntechnic ©   (2004-02-06 23:15) [4]

Я что-то вообще не понял о какой совместимости идёт речь и зачем автор велосипед изобретает. У STL-кого string-а есть для этих целей метод c_str(), а конвертация char * в string проходит вообще автоматически.


 
N169   (2004-02-06 23:44) [5]

Если использовать для написания проги C++ Builder, то можно достичь полной совместимости с дельфийским string-ом, используя (VCL) класс AnsiString.


 
VEG ©   (2004-02-07 01:01) [6]

>>Alex Konshin
Нет, как вы уже догадались, вы не все правильно поняли.
>Fantasist
Спасибо. У меня есть книжка, только поиск в ней очень затруднителен. Да ладно тут поиск. Там расписано все про создание классов. Есть и это, просто я почему-то предположил себе другой метод (не подумал про этот). Я основывался на том, что класс можно сделать совместимым с другими типами объявлением оператора operator type() const;, и это ввело меня в заблуждение.
Извините, что я надоедаю вопросами. Так уж получается...
>>Suntechnic
Действительно, в STL, что в составе C++Builder6 совместимость этих типов реализована, однако в STL из состава VisualC++6, как оказалось, не имеет таковой.
>>N169
Нет, разговор идет именно об STL-овском string.


 
Fantasist ©   (2004-02-08 01:55) [7]


> Извините, что я надоедаю вопросами. Так уж получается...


Ну, после этой фразы, претензии предьявлять будет тяжело. :)
"Вежливость, лучшее оружие вора." :) И почему люди (и я в том числе) об этом постоянно забывают?


> Я основывался на том, что класс можно сделать совместимым
> с другими типами объявлением оператора operator type() const;,
>


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


> Нет, разговор идет именно об STL-овском string.


Если речь о std::string тогда вообще не нужно ничего определять, все уже определенно. см Suntechnic © [4]


 
Suntechnic ©   (2004-02-08 10:34) [8]

>VEG © (07.02.04 01:01) [6]
Действительно, в STL, что в составе C++Builder6 совместимость этих типов реализована, однако в STL из состава VisualC++6, как оказалось, не имеет таковой.


Ещё разок.... чего кто не имеет? Я писал и на том и на другом и использовал STL весьма интенсивно. Никаких проблем при этом ни с какими стороками никогда не наблюдал и не думаю, что вообше кто либо их имел.


 
VEG ©   (2004-02-13 00:02) [9]

>>[7] Fantasist © (08.02.04 01:55)
>>[8] Suntechnic © (08.02.04 10:34)
На самом деле ошибка была моя, и не в коде, а в подключении модуля string. Надо было писать просто #include <string>, а я написал #include "string.h". Разобрался в этом, когда исходники string разглядывал. Оказалось, что там две разные верии:)
Извините пожалуйста, что по глупости своей побеспокоил.



Страницы: 1 вся ветка

Текущий архив: 2004.03.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
1-12448
_dEMOn
2004-02-22 21:18
2004.03.05
Skin


1-12333
Android
2004-02-22 20:28
2004.03.05
trichedit


3-12294
VLAD-MAL
2004-02-09 14:16
2004.03.05
Поддержка GUID в InterBase/FireBird


1-12319
111
2004-02-21 19:02
2004.03.05
*.txt ; *.rtf


1-12345
LastLamer
2004-02-21 21:28
2004.03.05
Системы документирования