Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878

Как сделать преобразование в string для своего класса

23.07.2014, 14:44. Показов 3270. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть 2 строчки кода

C++
1
2
Var a = "dfsfdfd";
string b = (string)a;
в класса есть перегруженный оператор operator string ();
но компилятор на него не реагирует и тупо не хочет компилировать, сразу пишет ошибку, почему и как сдела чтобы работало?

C++ (Qt)
1
Ошибка    12  error C2440: приведение типов: невозможно преобразовать "Var" в "std::string"    c:\users\admin\documents\visual studio 2012\projects\var\var\main.cpp   7   1   var
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2014, 14:44
Ответы с готовыми решениями:

Явное преобразование своего класса в int
Всем привет! Есть такой класс: public class Address { private int _Field; private int _position; ...

Создание своего Event для своего класса
как создать событие для своего класса? У C# нужно создать свое делегат, потом создать экземпляр этого делегата, и из вне привязать...

Как использовать stl для своего класса(для пользовательского типа данных)
Мне бы пример какой-нибудь а то в инете ищу ничего не могу найти, кроме базовых типов данных

18
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
23.07.2014, 14:51
Так может кодом поделитесь?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2014, 14:54
Цитата Сообщение от mh-coder Посмотреть сообщение
в класса есть перегруженный оператор operator string ();
Первое предположение: он не в public секции.
А вообще: лучше сделать метод to_string() для класса.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
23.07.2014, 14:55  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Так может кодом поделитесь?
Я не думаю что проблема в коде класса, ну если хотите то вот
http://mh-proxy.ru/download/kod.txt
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.07.2014, 15:00
C++
1
Var::operator string ()
А чего оператор ничего не возвращает ?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
23.07.2014, 15:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А чего оператор ничего не возвращает ?
потому что

C++ (Qt)
1
Ошибка    1   error C2549: в пользовательском преобразовании нельзя указывать возвращаемый тип   c:\users\admin\documents\visual studio 2012\projects\var\var\var.h  123 1   var
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
23.07.2014, 15:12
mh-coder,
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class test
{
public:
    operator string() const
    {
        return _T("Hello world");
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{   
    test tmp;
    auto ss = (string)tmp;
    cout << ss;
    system("pause");
    return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2014, 15:23
Вероятно, как-то так должно работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Var::operator string ()
{
    string ttemp;
    if(this->num !=INT_MIN){
        ttemp = to_string(static_cast<long long>(this->num));
    }else if(this->dnum !=DBL_MIN){
        ttemp = to_string(static_cast<long double>(this->dnum));
    }else{
        wchar_t * temp = (wchar_t*)this->str.c_str();
        char ch[4];
        for (int i = 0; i < this->str.length(); i++)
        {
            wcstombs(ch,&temp[i],1);
            ttemp += ch[0];
        }
    }
    return ttemp;
}
А вообще, конечно, код - говно редкостное.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
23.07.2014, 15:24  [ТС]
Tulosba, разници никакой, можно код вобще закоментировать и результат будет тотже
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
23.07.2014, 15:27
Цитата Сообщение от Avazart Посмотреть сообщение
А чего оператор ничего не возвращает ?
Потому как тыц
mh-coder, скорее всего проблема в том, что компилятор не может определиться с выбором функции
C++
1
2
    operator string ();
    operator char* ();
Оба этих оператора могут использоваться для приведения к string. А вот вам и пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
    operator string()
    {
        return "Hello world";
    }
    operator char* ()
    {
        return "Hello world";
    }
};
 
int main(int argc, char* argv[])
{
    test tmp;
    auto ss = (string)tmp;
    cout << ss;
    system("pause");
    return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2014, 15:34
Цитата Сообщение от mh-coder Посмотреть сообщение
разници никакой,
Ну в 2010 студии собралось например, после некоторых танцев с бубеном. К тому же в исходном коде ошибка с delete[] имеет место быть. Вы под какой средой собираете?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
23.07.2014, 15:45  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Оба этих оператора могут использоваться для приведения к string. А вот вам и пример:
мм, тоесть перегрузка оператора string можно вытирать и никак тут не исправишь, я правильно понял?

Цитата Сообщение от Tulosba Посмотреть сообщение
А вообще, конечно, код - говно редкостное.
почему?

Добавлено через 7 минут
Tulosba, я собираю в VS2012, а где там ошибка с delete[]?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2014, 15:57
Цитата Сообщение от mh-coder Посмотреть сообщение
почему?
Да хотя бы потому что из разряда "всё-в-одном". Я понимаю, конечно, вариантный тип, но зачем туда ещё и дату припахали, не ясно.
Цитата Сообщение от mh-coder Посмотреть сообщение
а где там ошибка с delete[]?
C++
1
delete[]temp;
в operator string. Сравните с тем, что я привел в сообщении #8 например.
0
23.07.2014, 16:06

Не по теме:

Ilot, mh-coder, А ну да в принципе, не доводилось еще использовать перегрузку такого оператора, да и в книгах не рекомендуют.

0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
23.07.2014, 16:09  [ТС]
ок, лан, еще вопрос, что и где мне нужно дописать чтобы я мог пеедавать в функции переменные с const?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
23.07.2014, 16:13
Лучший ответ Сообщение было отмечено mh-coder как решение

Решение

mh-coder, а я все-таки не поленился и откомпилил ваш код. Как и предполагалось ошибка - неоднозначность выбора конструктора для string:
C++
1
2
3
4
5
6
7
C:\Program Files\CodeBlocks\project\temp\main.cpp||In function 'int main(int, char**)':|
C:\Program Files\CodeBlocks\project\temp\main.cpp|2014|error: call of overloaded 'basic_string(Var&)' is ambiguous|
C:\Program Files\CodeBlocks\project\temp\main.cpp|2014|note: candidates are:|
C:\MinGWx86\i686-w64-mingw32\include\c++\bits\basic_string.h|512|note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]|
C:\MinGWx86\i686-w64-mingw32\include\c++\bits\basic_string.h|495|note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]|
C:\MinGWx86\i686-w64-mingw32\include\c++\bits\basic_string.h|460|note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]|
||=== Build finished: 1 errors, 15 warnings (0 minutes, 1 seconds) ===|
2
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
23.07.2014, 18:00
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Var {
private:
    string data;
public:
    Var(string data) {
        this->data = data;
    }
 
    operator string() const {
        return data;
    }
 
    operator const char*() const {
        return data.c_str();
    }
};
 
void main() {
    const Var var = "Some text";
    cout << var; // Вывод: Some text
 
    _getch();
}
1
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
24.07.2014, 17:14  [ТС]
еще вопрос, что и где мне нужно дописать чтобы я мог пеедавать в функции переменные с const?
0
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
24.07.2014, 17:18
Цитата Сообщение от mh-coder Посмотреть сообщение
переменные с const?
C++
1
2
3
4
5
class Var {
void method(const Var& other) const {
 
}
};
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2014, 17:18
Помогаю со студенческими работами здесь

Как перегрузить оператор для своего класса?
У меня есть класс, .h class Vertex { public: ~Vertex(); Vertex(); double GetX(); double GetY(); double GetZ(); void...

Как отловить событие для своего класса?
класс: TSomeClass = class(TObject) procedure OnKeyDown(var Message); message WM_KEYDOWN; end; var C: TSomeClass; begin

Как это сделать без класса string ?
В заданной строке вставить перед каждым восклицательным знаком запятую. Можно ли это переделать без использования string? #include...

Как создать свое событие для своего класса?
Добрый день всем! Подскажите как создать событие для своего класса? Экземпляр класса должен реагировать на определенные события,...

Как установить свойство по умолчанию для своего класса
Как установить свойство по умолчанию для своего класса


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru