Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/57: Рейтинг темы: голосов - 57, средняя оценка - 4.72
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

Приведение типов

11.12.2010, 01:43. Показов 11447. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Реализовываю явное и не явное приведение типов.
Есть два класса, сепаративных, A и B.
Реализацию явного преобразования делаю перегрузкой типов A и B.
Реализацию неявного преобразования делаю перегрузкой оператора "=".
Есть следующий момент: при реализации неявного преобразования this передаётся на A в случае вызова его объектом типа A, и на B, в случае вызова его объектом 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
class A
{
    char str[20];
    int count;
public:
    A();
    virtual ~A();
    void setParams(char*, int);
    void getParams();
    A& operator =();
    A operator A();
 
};
A::A()
{
    strcpy(str,"Oak");
    count = 3;
}
 
A::~A()
{
    
}
 
void A::getParams()
{
    cout<<"Tree: "<<str<<"\n";
    cout<<"Count: "<<count<<"\n\n";
}
 
void A::setParams(char* s, int c)
{
    strcpy(str,s);
    count  = c;
}
 
 
class B  
{
    char str[20];
    int count;
public:
    B();
    virtual ~B();
    void setParams(char*, int);
    void getParams();
 
};
 
B::B()
{
    strcpy(str,"Raspberry");
    count = 9;
}
 
B::~B()
{
 
}
 
void B::getParams()
{
    cout<<"Berry: "<<str<<"\n";
    cout<<"Count: "<<count<<"\n\n";
}
 
void B::setParams(char *s, int c)
{
    strcpy(str,s);
    count = c;
}
Добавлено через 1 час 8 минут

Не по теме:

Ребята...? :)



Добавлено через 5 часов 6 минут

Не по теме:

Есть варианты?

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2010, 01:43
Ответы с готовыми решениями:

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a = (float)123.4

Приведение типов
в GUI ни int str = static_convert&lt;int&gt;(Edit1-&gt;Text) ни int str = (int)Edit1-&gt;Text не приводит : E2034 Cannot convert...

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

35
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 01:15  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от lemegeton Посмотреть сообщение
Не обязательно. Есть еще копирование значения. Почитайте о том, как возвращаются значения из функций.
То есть в нашем случае идёт копирование. Я всё ещё веду речь о моём вопросе, он важен.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2010, 01:26
В случае присваивания a = s_c<A>(b), оператором B::A() создается новый объект A() и побитово, компиляторо-сгенерированным присваиванием, копируется в a; по сути a = b.operator A();. В случае i = b, функция b.operator int() возвращает целочисленное значение, которое присваивается i.

Цитата Сообщение от alexsvk Посмотреть сообщение
Хорошо, а как лучше это сделать? Стоит задача: показать пример использования неявного и явного приведения типов. Но я хочу сделать это с классами.
Если это был ваш вопрос, то на него уже есть ответ.

Цитата Сообщение от alexsvk
Я всё ещё веду речь о моём вопросе, он важен.
О, речь идет о выживании вида?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 01:30  [ТС]
ага, т.е. также реализуются встроенные cast'ы С++ под наследуемые классы? сам объект справа не меняется, а создаётся новый? Но а как тогда с адресом?
Встроенные cast - операторы, здесь тоже идёт создание объекта и побитовое копирование?
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2010, 01:35
UB, зависит от типов.

Добавлено через 2 минуты
Не думаю, что в случае
C++
1
2
3
char a = 1;
int b = 1;
b = static_cast<int>(a);
Будет использоваться дополнительная память.
1
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 01:43  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
UB, зависит от типов.

Добавлено через 2 минуты
Не думаю, что в случае
C++
1
2
3
char a = 1;
int b = 1;
b = static_cast<int>(a);
Будет использоваться дополнительная память.
Значит присваивание адреса присутствует..
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2010, 01:47
Это не адрес, это значение. Байты копируются из памяти в память.
Если бы a присваивался адрес b, изменение а затрагивало бы и b.

Вот присваивание адреса.
C++
1
2
3
4
int   a = 5;
int* b; 
b = &a;
*b = 7; // a == 7
Попробуйте, почитайте самые основы ассемблера, как вызываются "подпрограммы", как "присваиваются переменные". Много вопросов отпадет.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 16:01  [ТС]
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
#include <iostream>
using namespace std;
 
#include "A.h"
#include "B.h"
 
#include "A.h"
 
class B  
{
    int data;
public:
    B() { data = 2; }
    virtual ~B() {}
    operator A() const
    {
        return A();
    }
    operator int() const
    {
        return data;
    }
    B& operator =(A& a)
    {
        data = a.getData();
        return *this;
    }
    B& operator =(int x)
    {
        data = x;
        return *this;
    }
    int getData() const
    {
        return data;
    }
};
 
#include "B.h"
 
class A  
{
    int data;
public:
    A(void) { data = 1; }
    A(int x) { data = x; }
    virtual ~A(){}
    operator B()
    {
        return B();
    }
    operator int()
    {
        return data;
    }
    /*A& operator =(B& b)
    {
        data = b.getData();
        return *this;
    }*/
    A& operator =(int x)
    {
        data = x;
        return *this;
    }
    int getData()
    {
        return data;
    }
 
};
 
int i = 3;
    A a(4);
    B b;
 
    cout<<"a.data = "<<a.getData()<<"\n";
 
    //a = b êîìïèëÿòîð íå ïîíèìàåò,
    //íóæíî ëè ïðèâîäèòü ê int èëè ê B
    //ßâíîå ïðèâåäåíèå (êîìïèëÿòîð "íå ïîíèìàåò")
    a = static_cast<A> (b);// a = b.operator A(),
                           //ñîçäà¸òñÿ íîâûé îáúåêò òèïà A
                           // è ïîáèòîâî êîïèðóåòñÿ â a
    cout<<"Explicit casting: a.data = "<<a.getData()<<"\n";
 
    //Íåÿâíîå ïðèâåäåíèå (êîìïèëÿòîð "ïîíèìàåò")
    i = b; //i = b.operator int();
    cout<<"Implicit casting: i = "<<i<<"\n";
    a = i;
    cout<<"Implicit casting: a.data = "<<a.getData()<<"\n";
Вроде всё хорошо, но не видит A в B и наоборот..

Ещё есть ошибки на счёт оператора =, как слишком мало параметров бин. оператора, syntax error 'newline', видимо всё связано с невидением класса.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2010, 20:42
В классе B еще не известен класс А. Поэтому эти ф-ции некорректны.
C++
1
2
3
4
5
6
7
8
9
10
        operator A() const
        {
                return A();
        }
        ...
        B& operator =(A& a)
        {
                data = a.getData();
                return *this;
        }
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.12.2010, 00:09  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
В классе B еще не известен класс А. Поэтому эти ф-ции некорректны.
C++
1
2
3
4
5
6
7
8
9
10
        operator A() const
        {
                return A();
        }
        ...
        B& operator =(A& a)
        {
                data = a.getData();
                return *this;
        }
Делал #include "A.h". Ничего.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
13.12.2010, 00:17
Ничего и не выйдет. В любом случае, к моменту определения класса А, определение класса Б еще не закончено, как ни выеживайся. Поэтому не выйдет.

Если подумать, возникает непонятки с размерами типа, поскольку тип А включает в себя переменную типа Б, который включает в себя переменную типа А, который включает в себя переменную типа Б... ... ... ...
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.12.2010, 17:15  [ТС]
Да, но Вы предложили этот код, так как сделать правильно тогда?

Добавлено через 36 минут
Compiling...
StdAfx.cpp
d:\microsoft visual studio\myprojects\lr4_casting\b.h(20) : error C2833: 'operator A' is not a recognized operator or type
d:\microsoft visual studio\myprojects\lr4_casting\b.h(20) : error C2059: syntax error : 'newline'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(21) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : error C2143: syntax error : missing ',' before '&'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : error C2059: syntax error : '&'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(34) : error C2535: 'class B &__thiscall B::operator =(const int)' : member function already defined or declared
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : see declaration of '='
Error executing cl.exe.

lr4_casting.exe - 6 error(s), 0 warning(s)


Что меня и смутило в начале, почему A() - оператор.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
14.12.2010, 00:12
Тип, определенный первым, ничего не знает о типе, определенном вторым. Допустим, первый тип называется A, а второй B, допустим также, что имеются две переменные A a и B b.

Поэтому.
Второй тип (B) можно привести к первому (A) оператором с именем первого типа (B::operator A()) для операции a = b. <- вот это приведение типов.
Первый тип ко второму привести, используя оператор, нельзя, поскольку он определен раньше второго и второй тип не может быть закончен к началу второго.
Для обратного присваивания (b = a) можно определить оператор присваивания в классе B (B& operator= (const A&)), который будет заниматься присваиванием переменной типа B переменной типа A. <- вот это -- присваивание.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
15.12.2010, 21:54  [ТС]
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
#include <iostream>
using namespace std;
 
#include "A.h"
#include "B.h"
 
#include "B.h"
 
class A  
{
    int data;
public:
    A(void) { data = 1; }
    A(int x) { data = x; }
    virtual ~A(){}
    operator B()
    {
        return B();
    }
    operator int()
    {
        return data;
    }
    /*A& operator =(B& b)
    {
        data = b.getData();
        return *this;
    }*/
    A& operator =(int x)
    {
        data = x;
        return *this;
    }
    int getData()
    {
        return data;
    }
 
};
 
class B  
{
    int data;
public:
    B() { data = 2; }
    virtual ~B() {}
    operator A() const
    {
        return A();
    }
    operator int() const
    {
        return data;
    }
    B& operator =(const A& a)
    {
        data = a.getData();
        return *this;
    }
    B& operator =(int x)
    {
        data = x;
        return *this;
    }
    int getData() const
    {
        return data;
    }
};
d:\microsoft visual studio\myprojects\lr4_casting\b.h(20) : error C2833: 'operator A' is not a recognized operator or type
d:\microsoft visual studio\myprojects\lr4_casting\b.h(20) : error C2059: syntax error : 'newline'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(21) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : error C2143: syntax error : missing ',' before '&'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : error C2059: syntax error : '&'
d:\microsoft visual studio\myprojects\lr4_casting\b.h(34) : error C2535: 'class B &__thiscall B::operator =(const int)' : member function already defined or declared
d:\microsoft visual studio\myprojects\lr4_casting\b.h(28) : see declaration of '='
Error executing cl.exe.

lr4_casting.exe - 6 error(s), 0 warning(s)

И ещё, в main() я первое, что делаю, привожу b к a, что согласно Вашим словам, корректно, т.к. я сначала определил А. Но вот такие вот ошибки. Как их исправить?
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
15.12.2010, 22:34
Уберите эти инклуды. Не выйдет сделать оператор, приводящий класс к типу, описанному после класса.
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
class A
{
        int data;
public:
        A(void) { data = 1; }
        explicit A(int x) { data = x; }
        virtual ~A(){}
        // нельзя.
        //operator B()
        //{
        //        return B();
        //}
        operator int()
        {
                return data;
        }
        A& operator =(int x)
        {
                data = x;
                return *this;
        }
        int getData() const // спецификатор const
        {
                return data;
        }
};
class B
{
        int data;
public:
        B() { data = 2; }
        virtual ~B() {}
 
        operator A() const
        {
                return A();
        }
 
        operator int() const
        {
                return data;
        }
 
        B& operator =(const A& a)
        {
                data = a.getData();
                return *this;
        }
 
        B& operator =(int x)
        {
                data = x;
                return *this;
        }
        int getData() const
        {
                return data;
        }
};
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
15.12.2010, 22:36  [ТС]
Да, include было лишним
Но в классе В
C++
1
2
3
4
5
 B& operator =(const A& a)
        {
                data = a.getData();
                return *this;
        }
нужно const убрать
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
15.12.2010, 22:48
или в классе A для ф-ции getdata() добавить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2010, 22:48

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

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName; string LastName; int year;

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по байтам в памяти так: 1б 2б 3б 4б 2 0 0 0 4 ...

Приведение типов
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort. Вот что получилось: ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru