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

Оператор преобразования типа в char*

29.10.2018, 19:04. Показов 3320. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Вот у меня есть готовый код для класса Complex
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <cmath>
using namespace std;
 
class Complex
{
private:
    double re, im;
public:
    Complex() : re(0), im(0) {}
    Complex(double re, double im = 0) : re(re), im(im) {}
    double getRe()const
    {
        return re;
    }
    double getIm()const
    {
        return im;
    }
    void setRe(double re)
    {
        this->re = re;
    }
    void setIm(double im)
    {
        this->im = im;
    }
    void print()const
    {
        cout << re;
        if (im > 0) 
            cout<<"+"<<im << "i" << endl;
        else
            cout << im << "i" << endl;
    }
    operator double()
    {
        return sqrt(re*re+im*im);
    }
    operator int()
    {
        return sqrt(re*re+im*im);
    }
    Complex operator + (Complex &p)
    {
        Complex temp;
        temp.re = re + p.re;
        temp.im = im + p.im;
        return temp;
    }
    Complex operator - (Complex &p)
    {
        Complex temp;
        temp.re = re - p.re;
        temp.im = im - p.im;
        return temp;
    }
    bool operator == (Complex &p)
    {
        return re == p.re && im == p.im;
    }
    bool operator != (Complex &p)
    {
        return re != p.re || im != p.im;
    }
    bool operator>(const Complex&p)
    {
        return (this->re>p.re || this->im>p.im);
    }
    bool operator<(const Complex&p)
    {
        return !(this->re>p.re || this->im>p.im);
    }
    Complex &operator ++()
    {
        ++re;
        ++im;
        return *this;
    }
    Complex operator++(int)
    {
        Complex old=*this;
        --re;
        --im;
        return old;
    }
    Complex &operator --()
    {
        --re;
        --im;
        return *this;
    }
    Complex operator--(int)
    {
        Complex old=*this;
        --re;
        --im;
        return old;
    }
    friend Complex operator * (const Complex &com,Complex &p);
    friend Complex operator / (const Complex &com,Complex &p);
    friend Complex operator - (const Complex &p);
    friend ostream & operator <<(ostream &out, const Complex&com);
    friend istream & operator >>(istream &in, Complex&com);
};
Complex operator - (const Complex &p)
{
    Complex res(-p.re,-p.im);
    return res;
}
 
Complex operator * (const Complex &com,Complex &p)
{
    Complex temp((com.re * p.re)-(com.im * p.im), (com.re * p.im)+(com.im *p.re));// not valid in math  (a + bi)(c + di)= ac ? bd + (ad + bc)i
    return temp;
}
Complex operator / (const Complex &com,Complex &p)// check ((ac + bd) + (ad ? bc)i)/a^2+b^2 when z=a^2+b^2
{
    double r = p.re * p.re + p.im * p.im;
    Complex temp((com.re * p.re + com.im * p.im)/r,(com.re * p.im - com.im *p.re)/r);
    return temp;
}
ostream & operator <<(ostream &out, const Complex&com)
{
    out<<"Complex number:"<<com.re;
    if (com.im > 0) 
        out<<"+"<<com.im << "i" << endl;
    else
        out << com.im << "i" << endl;
    return out;
}
istream & operator >>(istream &in, Complex&com)
{
    cout<<"Input real axis:";
    in>>com.re;
    cout<<"Input imagine axis:";
    in>>com.im;
    return in;
}
int main()
{
    setlocale(0,"");
    Complex A(6, 2), B(3, -6);
    A.print();
    B.print();
    
    Complex C = A + B;
    C.print();
    
    Complex D = A - B;
    D.print();
    
    Complex E = A * B;
    E.print();
    
    Complex F = B++;
    B.print();
    F.print();
    cout << boolalpha << "A==B? " << (A == B) << endl;
    cout << boolalpha << "A!=B? " << (A != B) << endl;
    
    Complex L,M,K;
    cin>>L;
    cout<<L;
    cout<<"Перетворення типу Complex в double - "<<double(L)<<endl;
    cin>>M;
    cout<<M;
    cout<<"Перетворення типу Complex в int - "<<int(M)<<endl;
    return 0;
}
в этом же коде есть такие операторы как
C++
1
2
3
4
5
6
7
8
operator double()
    {
        return sqrt(re*re+im*im);
    }
    operator int()
    {
        return sqrt(re*re+im*im);
    }
В чем полагает прозьба. Помогите сделать такой же оператор преобразования только для типа char*
Код робочий! Нужно только дописать вот этот оператор(чтобы возвращало такое же значение как в int и double!) Хэлп ребята!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2018, 19:04
Ответы с готовыми решениями:

Оператор преобразования типа в классах
Допустим, есть три класса: //Фигура class figure; //Дамка class king { public: void step(figure&amp;);

Преобразования массива с типа int к типу char
Помогите решить задачу. Требуется создать шаблон класса для преобразования массива с типа int к типу char, помогите кто чем сможет буду...

Конструкторы, приведение типа и ошибка "Не найден оператор, принимающий правый операнд типа 'char *'"
#include &lt;stdio.h&gt; class A { int somemember; public: A(){printf(&quot;A()\n&quot;);} A(char*){printf(&quot;A(char*)\n&quot;);} ...

13
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2018, 19:14
Цитата Сообщение от julia_B Посмотреть сообщение
преобразования только для типа char*
sprintf

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
 
int main()
{
    char buff[256] {};
    sprintf(buff, "%f", 0.5);
 
    return 0;
}
1
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
29.10.2018, 19:23  [ТС]
Не хочет работать, компилятор даже сообщение не выводит((
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2018, 19:36
Цитата Сообщение от julia_B Посмотреть сообщение
Не хочет работать, компилятор даже сообщение не выводит((
std::string вместо char* лучше использовать
C++
1
2
3
4
5
6
7
#include <string>
 
int main()
{
    std::string s = std::to_string(0.5);
    return 0;
}
Добавлено через 3 минуты
C++
1
2
3
4
operator std::string()
{
    return std::to_string(this->operator double() ) ;
}
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
29.10.2018, 19:37  [ТС]
Я то это понимаю, но нам в задании в лабораторной дали именно char*
Но все же большое спасибо!
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2018, 19:38
Цитата Сообщение от julia_B Посмотреть сообщение
компилятор даже сообщение не выводит
в какой IDE кодишь?
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
29.10.2018, 19:41  [ТС]
VS2017
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.10.2018, 19:46
Цитата Сообщение от julia_B Посмотреть сообщение
но нам в задании в лабораторной дали именно char*
А задание можно посмотреть?
Этот оператор можно сделать, но тогда придется память выделять динамически. Это, соответственно, потребует ее освобождения после использования. Оператор преобразования, который выделяет динамически память и отдает ее в виде неконтролируемого указателя, является плохой практикой, поэтому тут два варианта. Либо вы не совсем верно поняли задание и от вас хотят немного иного, либо вас провоцируют писать плохой код. Во втором случае можно только посочувствовать. Покажите задание.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2018, 19:49
julia_B, как то так
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
25
26
27
28
29
30
31
#include <cstdio>
 
class Class
{
    double d;
 
public:
    operator double()
    {
        return d;
    }
    operator char*()
    {
        char* p = new char[256];
        sprintf_s(p, 256, "%f", this->operator double() );
 
        return p;
    }
};
 
int main()
{
    Class c;
    char* s = c;
 
    // ...
 
    delete s; // Обязательно удалить
 
    return 0;
}
1
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
29.10.2018, 19:54  [ТС]
Можно Вот
Создать класс Комплексное Число с полями целая и мнимая часть.
Определить следующие методы для класса:
o Конструктор по умолчанию;
o Конструктор с 1 и 2 параметрами;
o Операции сложения, вычитания двух комплексных чисел (в пределах класса), умножения и деления двух комплексных чисел (вне класса);
o Операции отношения:>, <(за пределами класса), ==,! = (внутри класса);
o унарными операцию -

Расширить класс индивидуального задания следующими операциями:
o Увеличение на 1 (++) (постфикс и префикс)
o Уменьшение на 1 (-) (постфикс и префикс).

Расширить класс индивидуального задания следующими операциями:
o Преобразование к типам double, int, char *;
o Введение и выведение экземпляра класса (>>, <<)

Добавлено через 19 секунд
Спасибо!
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
30.10.2018, 18:33  [ТС]
_stanislav, в моем коде с Complex работать не хочет(
Не выводит char на екран, только 00i
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.10.2018, 18:50
Лучший ответ Сообщение было отмечено julia_B как решение

Решение

julia_B, вот этот код у меня пашет
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <iostream>
#include <cmath>
#include <cstdio>
 
using namespace std;
 
class Complex
{
private:
    double re, im;
public:
    Complex() : re(0), im(0) {}
    Complex(double re, double im = 0) : re(re), im(im) {}
    double getRe()const
    {
        return re;
    }
    double getIm()const
    {
        return im;
    }
    void setRe(double re)
    {
        this->re = re;
    }
    void setIm(double im)
    {
        this->im = im;
    }
    void print()const
    {
        cout << re;
        if (im > 0) 
            cout<<"+"<<im << "i" << endl;
        else
            cout << im << "i" << endl;
    }
    operator double()
    {
        return sqrt(re*re+im*im);
    }
    operator int()
    {
        return sqrt(re*re+im*im);
    }
    operator char*()
    {
        char* p = new char[256];
        sprintf_s(p, 256, "%f", this->operator double() );
 
        return p;
    }
 
    Complex operator + (Complex &p)
    {
        Complex temp;
        temp.re = re + p.re;
        temp.im = im + p.im;
        return temp;
    }
    Complex operator - (Complex &p)
    {
        Complex temp;
        temp.re = re - p.re;
        temp.im = im - p.im;
        return temp;
    }
    bool operator == (Complex &p)
    {
        return re == p.re && im == p.im;
    }
    bool operator != (Complex &p)
    {
        return re != p.re || im != p.im;
    }
    bool operator>(const Complex&p)
    {
        return (this->re>p.re || this->im>p.im);
    }
    bool operator<(const Complex&p)
    {
        return !(this->re>p.re || this->im>p.im);
    }
    Complex &operator ++()
    {
        ++re;
        ++im;
        return *this;
    }
    Complex operator++(int)
    {
        Complex old=*this;
        --re;
        --im;
        return old;
    }
    Complex &operator --()
    {
        --re;
        --im;
        return *this;
    }
    Complex operator--(int)
    {
        Complex old=*this;
        --re;
        --im;
        return old;
    }
    friend Complex operator * (const Complex &com,Complex &p);
    friend Complex operator / (const Complex &com,Complex &p);
    friend Complex operator - (const Complex &p);
    friend ostream & operator <<(ostream &out, const Complex&com);
    friend istream & operator >>(istream &in, Complex&com);
};
Complex operator - (const Complex &p)
{
    Complex res(-p.re,-p.im);
    return res;
}
 
Complex operator * (const Complex &com,Complex &p)
{
    Complex temp((com.re * p.re)-(com.im * p.im), (com.re * p.im)+(com.im *p.re));// not valid in math  (a + bi)(c + di)= ac ? bd + (ad + bc)i
    return temp;
}
Complex operator / (const Complex &com,Complex &p)// check ((ac + bd) + (ad ? bc)i)/a^2+b^2 when z=a^2+b^2
{
    double r = p.re * p.re + p.im * p.im;
    Complex temp((com.re * p.re + com.im * p.im)/r,(com.re * p.im - com.im *p.re)/r);
    return temp;
}
ostream & operator <<(ostream &out, const Complex&com)
{
    out<<"Complex number:"<<com.re;
    if (com.im > 0) 
        out<<"+"<<com.im << "i" << endl;
    else
        out << com.im << "i" << endl;
    return out;
}
istream & operator >>(istream &in, Complex&com)
{
    cout<<"Input real axis:";
    in>>com.re;
    cout<<"Input imagine axis:";
    in>>com.im;
    return in;
}
int main()
{
    setlocale(0,"");
    Complex A(6, 2), B(3, -6);
    A.print();
    B.print();
    
    Complex C = A + B;
    C.print();
    
    Complex D = A - B;
    D.print();
    
    Complex E = A * B;
    E.print();
    
    Complex F = B++;
    B.print();
    F.print();
    cout << boolalpha << "A==B? " << (A == B) << endl;
    cout << boolalpha << "A!=B? " << (A != B) << endl;
    
    Complex L,M,K;
    cin>>L;
    cout<<L;
    cout<<"Перетворення типу Complex в double - "<<static_cast<double>(L)<<endl;
    cin>>M;
    cout<<M;
    cout<<"Перетворення типу Complex в int - "<<static_cast<int>(M)<<endl;
    cin>>K;
    cout<<K;
    cout<<"Перетворення типу Complex в char* - "<< static_cast<char*>(K)<<endl;
 
    return 0;
}
Миниатюры
Оператор преобразования типа в char*  
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.10.2018, 19:41
Лучший ответ Сообщение было отмечено julia_B как решение

Решение

кто подскажет почему данные конструкции дают разный результат:
C++
1
2
3
4
    cout<< K << endl; // выдает странный результат
    cout<< char*(K) << endl; // пишет что использование имени не допускается (не компилируется)
    cou<< (char*)K << endl; // работает
    cout<< static_cast<char*>(K) <<endl; // работает
Добавлено через 34 минуты
C++
1
2
3
4
    cout<< K << endl; // тут вызывается твой перегруженный operator <<
    cout<< char*(K) << endl; // пишет что использование имени не допускается (не компилируется)
    cou<< (char*)K << endl; // тут вызывается operator char*
    cout<< static_cast<char*>(K) <<endl; // тут вызывается operator char*
Почему не компилируется данный код не понятно.
C++
1
cout<< char*(K) << endl;
Добавлено через 2 минуты
наверно дело в операторе *
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
30.10.2018, 19:52
Цитата Сообщение от _stanislav Посмотреть сообщение
наверно дело в операторе *
Скажем так, дело в синтаксической неоднозначности.
Если интересны подробности, можно открыть описание синтаксиса в стандарте.
A simple-type-specifier or typename-specifier followed by a parenthesized optional expression-list or by a braced-init-list (the initializer) constructs a value of the specified type given the initializer.
Что такое simple-type-specifier описано здесь:
http://eel.is/c++draft/dcl.type.simple
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.10.2018, 19:52
Помогаю со студенческими работами здесь

Как переопределить оператор ++ типа char?
Добрий день Хочу спросить возможно ли как-то переопредилить оператор ++ типа char?

Оператор преобразования типа и его эквивалентные замены, поиск строки в текстовом файле , содержащей заданный
Господа, был бы очень признателен если бы кто то помог ответить на вапросы http://cs616225.vk.me/v616225102/122f8/5kAaFEGoDn0.jpg

Условие типа if( масив типа char[x] [y] != переменная типа char) не срабатывает
Создал функцию ChangeWay(). Все, кроме if(map !=ar) (обе переменные типа char) работает нормально, а когда выполнение доходит до этого...

Аргумент типа (const char*) несовместим с параметром типа (char*). Как исправить?
#include &quot;Table.h&quot; #include &quot;Contour.h&quot; #include &quot;TwoShape.h&quot; #include &lt;iostream&gt; int main() { Contour circle; ...

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере 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