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

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

11.12.2010, 01:43. Показов 10858. Ответов 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
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 02:36
Вы хотите что-то в этом роде?
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
class A
{
        int data;
public:
        A(void) : data(1) {}
        int GetData() const{ return data; }
 
};
 
class B
{
        int data;
public:
        B(void) : data(2) {}
        operator A() const
        {
                return A();
        }
 
        B& operator= (const A& a)
        {
                data = a.GetData();
                return *this;
        }
};
 
int main()
{
        A a;
        B b;
        b = a;
        return 0;
}
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 09:10  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
Вы хотите что-то в этом роде?
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
class A
{
        int data;
public:
        A(void) : data(1) {}
        int GetData() const{ return data; }
 
};
 
class B
{
        int data;
public:
        B(void) : data(2) {}
        operator A() const
        {
                return A();
        }
 
        B& operator= (const A& a)
        {
                data = a.GetData();
                return *this;
        }
};
 
int main()
{
        A a;
        B b;
        b = a;
        return 0;
}
Да, только добавить ещё реализацию явного преобразования в main()
C++
1
2
3
4
5
6
7
8
int main()
{
        A a;
        B b;
        b = a;
[U]        a = (A) b;[/U]
        return 0;
}
На сколько я вижу, мы просто присваиваем значения полей. Значит более физическую перегрузку сделать нельзя или... нежелательно? Пользуясь reinterpret_cast, dynamic_cast и т.д.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 10:55
Лучше так.
C++
1
a = static_cast<A>(b);
Вызовется оператор приведения класса B к классу А.

Добавлено через 1 минуту
Цитата Сообщение от alexsvk Посмотреть сообщение
На сколько я вижу, мы просто присваиваем значения полей. Значит более физическую перегрузку сделать нельзя или... нежелательно? Пользуясь reinterpret_cast, dynamic_cast и т.д.
Не очень понимаю мысль. Чтобы превратить ужа в ежа, придется пересадить первому колючки.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 11:43  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
Лучше так.
C++
1
a = static_cast<A>(b);
Вызовется оператор приведения класса B к классу А.

Добавлено через 1 минуту

Не очень понимаю мысль. Чтобы превратить ужа в ежа, придется пересадить первому колючки.
Я Вас понял. Значит при перегрузке типа данных для явного преобразования и перегрузки оператора "=" для неявного преобразования ставим static_cast? Почему лучше использовать static_cast?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 11:58
На этот вопрос отвечает Бьерн Страуструп. Там же он говорит, что явных приведений типов лучше вообще избегать.

Добавлено через 4 минуты
Добавлю, что оператор приведения типа нужен, чтобы сделать присваивание a = b, а перегрузка присваивания для обратной операции b = a. Явное приведение типа не обязательно.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 12:08  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
На этот вопрос отвечает Бьерн Страуструп. Там же он говорит, что явных приведений типов лучше вообще избегать.

Добавлено через 4 минуты
Добавлю, что оператор приведения типа нужен, чтобы сделать присваивание a = b, а перегрузка присваивания для обратной операции b = a. Явное приведение типа не обязательно.
Хорошо, спасибо. Но на счёт идеи я правильно изложил: при перегрузке '=' и A, B (типы данных,классы) используется static_cast?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 12:52
C++
1
2
3
4
5
6
 a = b; // неявное приведение типа
 a = static_cast<A>(b); // относительно безопасный способ
                                 // явного приведение типа,
                                 // желательно использовать только когда
                                 // компилятор не может сам найти способ
                                 // приведения типа
Добавлено через 7 минут
Рассмотрим менее однозначный случай.
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
class A
{
        int data;
public:
        A(void) : data(1) {}
        A& operator= (int i)
        {
                data = i;
                return *this;
        }
        int GetData() const{ return data; }
 
};
 
class B
{
        int data;
public:
        B(void) : data(2) {}
        operator int() const
        {
                return data;
        }
        operator A() const
        {
                return A();
        }
 
        B& operator= (const A& a)
        {
                data = a.GetData();
                return *this;
        }
};
 
int main()
{
        A a;
        B b;
        a = b; // что делать бедному компилятору?
                 // привести b к int или привести к a?
        a = static_cast<A>(b); // но мы-то знаем!
        return 0;
}
1
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 19:15  [ТС]
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
class A
{
    int data;
private:
    A() { data = 0; }
    operator B()
    {
        return B();
    }
    A& operator =(B& b)
    {
        data = b.getData();
        return *this;
    }
    int getData() { return data; }
}
 
class B
{
    int data;
 
private:
    B() { data = 0 };
    operator A()
    {
        return A();
    }
 
    B& operator =(A& a)
    {
        data = a.getData();
        static_cast<B>(a);
        return *this;
    }
    int getData() { return data; }
}
А что-то в это духе, дабы в main() написать только лишь a = b или a = (A) b или (A)b;
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 19:41
Так не выйдет, потому что класс А не знает о существовании класса Б.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 20:06  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
Так не выйдет, потому что класс А не знает о существовании класса Б.
Хорошо, а как лучше это сделать? Стоит задача: показать пример использования неявного и явного приведения типов. Но я хочу сделать это с классами.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 20:19
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
class A
{
        int data;
public:
        A(void) : data(1) {}
        A& operator= (int i)
        {
                data = i;
                return *this;
        }
        int GetData() const{ return data; }
 
};
 
class B
{
        int data;
public:
        B(void) : data(2) {}
        operator int() const
        {
                return data;
        }
        operator A() const
        {
                return A();
        }
 
        B& operator= (const A& a)
        {
                data = a.GetData();
                return *this;
        }
};
 
int main()
{
        A a;
        B b;
        int i;
        a = static_cast<A>(b); // явное приведение (компилятор не поймет)
        i = b;                // неявное приведение (компилятор сам разберется)
        return 0;
}
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 20:44  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
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
class A
{
        int data;
public:
        A(void) : data(1) {}
        A& operator= (int i)
        {
                data = i;
                return *this;
        }
        int GetData() const{ return data; }
 
};
 
class B
{
        int data;
public:
        B(void) : data(2) {}
        operator int() const
        {
                return data;
        }
        operator A() const
        {
                return A();
        }
 
        B& operator= (const A& a)
        {
                data = a.GetData();
                return *this;
        }
};
 
int main()
{
        A a;
        B b;
        int i;
        a = static_cast<A>(b); // явное приведение (компилятор не поймет)
        i = b;                // неявное приведение (компилятор сам разберется)
        return 0;
}
C++
1
 a = static_cast<A>(b); // явное приведение (компилятор не поймет)
Сначала работает оператор static_cast, вызывая метод класса B operator A() const, который, в свою очередь, в классе A, по умолчанию, вызывает кон-р A(void) : data(1) {}. Как результат, a = static_cast<A> (b) присвоит полю data объекта а значение 1.

C++
1
 i = b;                // неявное приведение (компилятор сам разберется)
b имеет тип A.
Но если Вы приводите пример с учётом, что b имеет тип B, то вызовется operator int() const, который вернёт data. Как результат, i = 2.

Всё правильно?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 21:27
В целом, да.
Только A operator A() создает (вызывая конструктор) и возвращает объект типа A.
... и b имеет тип B на всей длине программы. Откуда вы взяли, что b имеет тип A?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 21:30  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
В целом, да.
Только A operator A() создает (вызывая конструктор) и возвращает объект типа A.
... и b имеет тип B на всей длине программы. Откуда вы взяли, что b имеет тип A?
Да, про кон-р не досказал, но имел в виду.
static_cast<A>b, - b после этого остаётся типа B?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 22:14
Безусловно.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 22:17  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
Безусловно.
ага, т.е. также реализуются встроенные cast'ы С++ под наследуемые классы? сам объект справа не меняется, а создаётся новый? Но а как тогда с адресом?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.12.2010, 22:23
С каким адресом?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 00:40  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
С каким адресом?
когда мы присваиваем переменную другой переменной - она берёт значение по этому адресу, т.е. адрес
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.12.2010, 00:52
Не обязательно. Есть еще копирование значения. Почитайте о том, как возвращаются значения из функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2010, 00:52
Помогаю со студенческими работами здесь

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

Приведение типов
Доброго времени суток. Пусть имеются две структуры 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. Вот что получилось: ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru