Форум программистов, компьютерный форум 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++ Приведение типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 01:15  [ТС]     Приведение типов #21
Цитата Сообщение от lemegeton Посмотреть сообщение
Не обязательно. Есть еще копирование значения. Почитайте о том, как возвращаются значения из функций.
То есть в нашем случае идёт копирование. Я всё ещё веду речь о моём вопросе, он важен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 01:26     Приведение типов #22
В случае присваивания a = s_c<A>(b), оператором B::A() создается новый объект A() и побитово, компиляторо-сгенерированным присваиванием, копируется в a; по сути a = b.operator A();. В случае i = b, функция b.operator int() возвращает целочисленное значение, которое присваивается i.

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

Цитата Сообщение от alexsvk
Я всё ещё веду речь о моём вопросе, он важен.
О, речь идет о выживании вида?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 01:30  [ТС]     Приведение типов #23
ага, т.е. также реализуются встроенные cast'ы С++ под наследуемые классы? сам объект справа не меняется, а создаётся новый? Но а как тогда с адресом?
Встроенные cast - операторы, здесь тоже идёт создание объекта и побитовое копирование?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 01:35     Приведение типов #24
UB, зависит от типов.

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

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

Вот присваивание адреса.
C++
1
2
3
4
int   a = 5;
int* b; 
b = &a;
*b = 7; // a == 7
Попробуйте, почитайте самые основы ассемблера, как вызываются "подпрограммы", как "присваиваются переменные". Много вопросов отпадет.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
12.12.2010, 16:01  [ТС]     Приведение типов #27
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', видимо всё связано с невидением класса.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
12.12.2010, 20:42     Приведение типов #28
В классе 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;
        }
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
13.12.2010, 00:09  [ТС]     Приведение типов #29
Цитата Сообщение от 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". Ничего.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.12.2010, 00:17     Приведение типов #30
Ничего и не выйдет. В любом случае, к моменту определения класса А, определение класса Б еще не закончено, как ни выеживайся. Поэтому не выйдет.

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

Добавлено через 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() - оператор.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
14.12.2010, 00:12     Приведение типов #32
Тип, определенный первым, ничего не знает о типе, определенном вторым. Допустим, первый тип называется A, а второй B, допустим также, что имеются две переменные A a и B b.

Поэтому.
Второй тип (B) можно привести к первому (A) оператором с именем первого типа (B::operator A()) для операции a = b. <- вот это приведение типов.
Первый тип ко второму привести, используя оператор, нельзя, поскольку он определен раньше второго и второй тип не может быть закончен к началу второго.
Для обратного присваивания (b = a) можно определить оператор присваивания в классе B (B& operator= (const A&)), который будет заниматься присваиванием переменной типа B переменной типа A. <- вот это -- присваивание.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
15.12.2010, 21:54  [ТС]     Приведение типов #33
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, что согласно Вашим словам, корректно, т.к. я сначала определил А. Но вот такие вот ошибки. Как их исправить?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.12.2010, 22:34     Приведение типов #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;
        }
};
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
15.12.2010, 22:36  [ТС]     Приведение типов #35
Да, include было лишним
Но в классе В
C++
1
2
3
4
5
 B& operator =(const A& a)
        {
                data = a.getData();
                return *this;
        }
нужно const убрать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2010, 22:48     Приведение типов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.12.2010, 22:48     Приведение типов #36
или в классе A для ф-ции getdata() добавить.
Yandex
Объявления
15.12.2010, 22:48     Приведение типов
Ответ Создать тему
Опции темы

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