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

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

11.12.2010, 01:43. Показов 11153. Ответов 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
4903 / 2696 / 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru