Форум программистов, компьютерный форум CyberForum.ru

Приведение типов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.82
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 01:43     Приведение типов #1
Добрый вечер!
Реализовываю явное и не явное приведение типов.
Есть два класса, сепаративных, 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 минут

Не по теме:

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

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2010, 01:43     Приведение типов
Посмотрите здесь:

C++ Приведение типов
Приведение типов C++
C++ Приведение типов?
C++ Приведение типов.
C++ Приведение типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 02:36     Приведение типов #2
Вы хотите что-то в этом роде?
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;
}
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 09:10  [ТС]     Приведение типов #3
Цитата Сообщение от 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 и т.д.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 10:55     Приведение типов #4
Лучше так.
C++
1
a = static_cast<A>(b);
Вызовется оператор приведения класса B к классу А.

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

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

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

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

Добавлено через 4 минуты
Добавлю, что оператор приведения типа нужен, чтобы сделать присваивание a = b, а перегрузка присваивания для обратной операции b = a. Явное приведение типа не обязательно.
Хорошо, спасибо. Но на счёт идеи я правильно изложил: при перегрузке '=' и A, B (типы данных,классы) используется static_cast?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 12:52     Приведение типов #8
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;
}
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 19:15  [ТС]     Приведение типов #9
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;
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 19:41     Приведение типов #10
Так не выйдет, потому что класс А не знает о существовании класса Б.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 20:06  [ТС]     Приведение типов #11
Цитата Сообщение от lemegeton Посмотреть сообщение
Так не выйдет, потому что класс А не знает о существовании класса Б.
Хорошо, а как лучше это сделать? Стоит задача: показать пример использования неявного и явного приведения типов. Но я хочу сделать это с классами.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 20:19     Приведение типов #12
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;
}
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 20:44  [ТС]     Приведение типов #13
Цитата Сообщение от 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.

Всё правильно?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 21:27     Приведение типов #14
В целом, да.
Только A operator A() создает (вызывая конструктор) и возвращает объект типа A.
... и b имеет тип B на всей длине программы. Откуда вы взяли, что b имеет тип A?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 21:30  [ТС]     Приведение типов #15
Цитата Сообщение от lemegeton Посмотреть сообщение
В целом, да.
Только A operator A() создает (вызывая конструктор) и возвращает объект типа A.
... и b имеет тип B на всей длине программы. Откуда вы взяли, что b имеет тип A?
Да, про кон-р не досказал, но имел в виду.
static_cast<A>b, - b после этого остаётся типа B?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 22:14     Приведение типов #16
Безусловно.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
11.12.2010, 22:17  [ТС]     Приведение типов #17
Цитата Сообщение от lemegeton Посмотреть сообщение
Безусловно.
ага, т.е. также реализуются встроенные cast'ы С++ под наследуемые классы? сам объект справа не меняется, а создаётся новый? Но а как тогда с адресом?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.12.2010, 22:23     Приведение типов #18
С каким адресом?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 00:40  [ТС]     Приведение типов #19
Цитата Сообщение от lemegeton Посмотреть сообщение
С каким адресом?
когда мы присваиваем переменную другой переменной - она берёт значение по этому адресу, т.е. адрес
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 00:52     Приведение типов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 00:52     Приведение типов #20
Не обязательно. Есть еще копирование значения. Почитайте о том, как возвращаются значения из функций.
Yandex
Объявления
12.12.2010, 00:52     Приведение типов
Ответ Создать тему
Опции темы

Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru