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

ООП + полиморфизм = wtf? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 19:49     ООП + полиморфизм = wtf? #1
Есть:
Класс A - отец
Класс Б - дочерний
Класс Ц - дочерный, наследуеться от А(сестра Б)

Есть массив типа А, с названием Mass.
Он хранит в себе объекты классов Б и Ц.

в классе Б есть функция F().
в классе Ц есть функция F() (отличающаяся функционалом).

Внамание! Вопрос:
как провернуть такую часть кода - Mass[0..100].F();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2011, 19:49     ООП + полиморфизм = wtf?
Посмотрите здесь:

ООП Полиморфизм Наследование C++
Очередное WTF ))) C++
Расширение языка С. WTF? C++
Спецификация файла. WTF? C++
Подкиньте практику по ООП + полиморфизм + шаблоны пожалуйста. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:22  [ТС]     ООП + полиморфизм = wtf? #21
C++
1
2
3
4
abstract class D3D_UI
{
      virtual void setStatus(LPVOID Object,int newstatus) = 0;
};


this declaration has no storage class or type specifier c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\direct3d_ui.h 1 1 Robotino V2 Directx 9



позабыл я как это делаеться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
27.08.2011, 20:25     ООП + полиморфизм = wtf? #22
Цитата Сообщение от BAIZOR Посмотреть сообщение
Спасибо, мне предложили этот вариант, и я просто продемонтрировал что он не рабочий.

Я уже понял все, только одного не знаю - как сделать класс Абстрактным, я давненько это делал... в нем не может быть не абстрактных функций и еще что-то ?

Вы можете в своем базовом классе функцию setStatus объявить следующим образом

C++
1
virtual void setStatus(LPVOID Object,int newstatus) = 0;
Это между прочим не мешает вам опеределить в базовом классе тело самой функции, если есть такая необходимость, то есть если в производных классах в этой функции используется вызов setStatus из их кода.

Добавлено через 1 минуту
Цитата Сообщение от BAIZOR Посмотреть сообщение
C++
1
2
3
4
abstract class D3D_UI
{
      virtual void setStatus(LPVOID Object,int newstatus) = 0;
};


this declaration has no storage class or type specifier c:\users\baizor\desktop\robotino v3 directx 9 - копия\robotino v2 directx 9\direct3d_ui.h 1 1 Robotino V2 Directx 9



позабыл я как это делаеться?
Больше ничего добавлять не надо. Достаточно одну функцию объявить чисто виртуальной. Проще всего это сделать для деструктора класса.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:26  [ТС]     ООП + полиморфизм = wtf? #23
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это между прочим не мешает вам опеределить в базовом классе тело самой функции, если есть такая необходимость, то есть если в производных классах в этой функции используется вызов setStatus из их кода.
хм... мудро, учту

Добавлено через 42 секунды
Цитата Сообщение от Сыроежка Посмотреть сообщение
Больше ничего добавлять не надо. Достаточно одну функцию объявить чисто виртуальной. Проще всего это сделать для деструктора класса.
да, но ошибка, вон, я дописал под кодом
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:26     ООП + полиморфизм = wtf? #24
Цитата Сообщение от BAIZOR Посмотреть сообщение
позабыл я как это делаеться?
Слово abstract зачем?
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:29  [ТС]     ООП + полиморфизм = wtf? #25
Цитата Сообщение от Сыроежка Посмотреть сообщение
this declaration has no storage class or type specifier

=(....

Добавлено через 52 секунды
Цитата Сообщение от grizlik78 Посмотреть сообщение
Слово abstract зачем?
убрал - 'D3D_UI' : cannot instantiate abstract class

Добавлено через 37 секунд
опять же, вопрос, разве ничего больше не надо для абстрактного класса?

Добавлено через 29 секунд
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class D3D_UI
{
protected:
    UINT                        status;
    LPDIRECT3DTEXTURE9          sleep,activ,down;
    LPDIRECT3DVERTEXBUFFER9     g_pVB;
    bool                        enable;
    time_t                      timer;
    bool                        (*function)(Robotino3D*);
 
public:
    D3DRectangle                Rectangle;
    bool                        Down;
 
    D3D_UI(){status=0;}
    D3D_UI(LPDIRECT3DDEVICE9 &pd3dDevice,
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        UpdateObject(pd3dDevice, sleep_, activ_, down_, x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    static void TransformCoords(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                D3DCamera &Camera, 
                                D3DXMATRIX &Transform, 
                                D3DXVECTOR3 &pos, 
                                D3DXVECTOR3 &dir, 
                                int x, 
                                int y)
    {
        float                       px,
                                    py;
 
        D3DVIEWPORT9                ViewPort;
        D3DXMATRIX                  MatrixProjection;
 
        pd3dDevice->GetViewport     (&ViewPort);
        pd3dDevice->GetTransform    (D3DTS_PROJECTION, &MatrixProjection);
 
        px      =   ((( 2.0f*(float)x) / (float)ViewPort.Width)  - 1.0f) / MatrixProjection._11;
        py      =   (((-2.0f*(float)y) / (float)ViewPort.Height) + 1.0f) / MatrixProjection._22;
 
        pos.x   =   Camera.CamPos.x; 
        pos.y   =   Camera.CamPos.y; 
        pos.z   =   Camera.CamPos.z;
  
        dir.x   =   px; 
        dir.y   =   py; 
        dir.z   =   1.0;
 
        D3DXVec3TransformCoord( 
          &pos, 
          &pos, 
          &Transform 
        ); 
  
        D3DXVec3TransformNormal( 
          &dir, 
          &dir, 
          &Transform 
        );
    }
    virtual void setStatus(LPVOID Object,int newstatus) = 0;
 
    bool Select(D3DXVECTOR3 &pos, D3DXVECTOR3 &dir)
    {
        float               Distance    =   2000.0f;
 
        CUSTOMVERTEX        *buffer     =   Rectangle.init();
 
        bool                Result_1    =   false,
                            Result_2    =   false;
 
        Result_1    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[0].x, buffer[0].y, buffer[0].z), 
                                                &D3DXVECTOR3(buffer[1].x, buffer[1].y, buffer[1].z),
                                                &D3DXVECTOR3(buffer[2].x, buffer[2].y, buffer[2].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        Result_2    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[3].x, buffer[3].y, buffer[3].z), 
                                                &D3DXVECTOR3(buffer[4].x, buffer[4].y, buffer[4].z),
                                                &D3DXVECTOR3(buffer[5].x, buffer[5].y, buffer[5].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        return Result_1 || Result_2;
    }
    void SetTimer(UINT t_size)
    {
        timer   =   clock() + t_size;
    }
    void UpdateObject(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        Down        = false;
        status      = 0;
        g_pVB       =   NULL;
        sleep       =   NULL;
        activ       =   NULL;
        down        =   NULL;
        D3DXCreateTextureFromFile(pd3dDevice,sleep_, &sleep);
        D3DXCreateTextureFromFile(pd3dDevice,activ_, &activ);
        D3DXCreateTextureFromFile(pd3dDevice,down_ , &down);
        Rectangle   = *new D3DRectangle(x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    LPDIRECT3DTEXTURE9 getTexture()
    {
        if(status == 0) return sleep;
        if(status == 1) return activ;
        if(status == 2) return down;
    }
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
        pd3dDevice->SetFVF              ( D3DFVF_CUSTOMVERTEX );
        pd3dDevice->SetStreamSource     ( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
 
        if(FAILED(pd3dDevice->SetTexture    (0, getTexture())))             return false;
        if(FAILED(pd3dDevice->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 2)))    return false;
 
        return true;
    }
};
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:31     ООП + полиморфизм = wtf? #26
Цитата Сообщение от BAIZOR Посмотреть сообщение
убрал - 'D3D_UI' : cannot instantiate abstract class
Ну да. Потому что нельзя создать вектор с элементами этого типа. Можно и нужно создать вектор указателей на этот класс. Правда удалять элементы тогда вручную придётся.

Добавлено через 2 минуты
Кстати, возможно этот класс и не должен быть абстрактным. Это было просто предположение. Но потомков в один массив собрать можно только с помощью указателей.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:33  [ТС]     ООП + полиморфизм = wtf? #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
Потому что нельзя создать вектор с элементами этого типа.
Вот оно! Спасибо =)

Цитата Сообщение от grizlik78 Посмотреть сообщение
Правда удалять элементы тогда вручную придётся
А вызов деструктора из детей пойдет?
Сыроежка
Заблокирован
27.08.2011, 20:33     ООП + полиморфизм = wtf? #28
Цитата Сообщение от BAIZOR Посмотреть сообщение
=(....

Добавлено через 52 секунды


убрал - 'D3D_UI' : cannot instantiate abstract class

Добавлено через 37 секунд
опять же, вопрос, разве ничего больше не надо для абстрактного класса?

Добавлено через 29 секунд
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class D3D_UI
{
protected:
    UINT                        status;
    LPDIRECT3DTEXTURE9          sleep,activ,down;
    LPDIRECT3DVERTEXBUFFER9     g_pVB;
    bool                        enable;
    time_t                      timer;
    bool                        (*function)(Robotino3D*);
 
public:
    D3DRectangle                Rectangle;
    bool                        Down;
 
    D3D_UI(){status=0;}
    D3D_UI(LPDIRECT3DDEVICE9 &pd3dDevice,
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        UpdateObject(pd3dDevice, sleep_, activ_, down_, x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    static void TransformCoords(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                D3DCamera &Camera, 
                                D3DXMATRIX &Transform, 
                                D3DXVECTOR3 &pos, 
                                D3DXVECTOR3 &dir, 
                                int x, 
                                int y)
    {
        float                       px,
                                    py;
 
        D3DVIEWPORT9                ViewPort;
        D3DXMATRIX                  MatrixProjection;
 
        pd3dDevice->GetViewport     (&ViewPort);
        pd3dDevice->GetTransform    (D3DTS_PROJECTION, &MatrixProjection);
 
        px      =   ((( 2.0f*(float)x) / (float)ViewPort.Width)  - 1.0f) / MatrixProjection._11;
        py      =   (((-2.0f*(float)y) / (float)ViewPort.Height) + 1.0f) / MatrixProjection._22;
 
        pos.x   =   Camera.CamPos.x; 
        pos.y   =   Camera.CamPos.y; 
        pos.z   =   Camera.CamPos.z;
  
        dir.x   =   px; 
        dir.y   =   py; 
        dir.z   =   1.0;
 
        D3DXVec3TransformCoord( 
          &pos, 
          &pos, 
          &Transform 
        ); 
  
        D3DXVec3TransformNormal( 
          &dir, 
          &dir, 
          &Transform 
        );
    }
    virtual void setStatus(LPVOID Object,int newstatus) = 0;
 
    bool Select(D3DXVECTOR3 &pos, D3DXVECTOR3 &dir)
    {
        float               Distance    =   2000.0f;
 
        CUSTOMVERTEX        *buffer     =   Rectangle.init();
 
        bool                Result_1    =   false,
                            Result_2    =   false;
 
        Result_1    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[0].x, buffer[0].y, buffer[0].z), 
                                                &D3DXVECTOR3(buffer[1].x, buffer[1].y, buffer[1].z),
                                                &D3DXVECTOR3(buffer[2].x, buffer[2].y, buffer[2].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        Result_2    =    D3DXIntersectTri   (   &D3DXVECTOR3(buffer[3].x, buffer[3].y, buffer[3].z), 
                                                &D3DXVECTOR3(buffer[4].x, buffer[4].y, buffer[4].z),
                                                &D3DXVECTOR3(buffer[5].x, buffer[5].y, buffer[5].z),
                                                &pos,
                                                &dir,
                                                0,
                                                0,
                                                &Distance);
 
        return Result_1 || Result_2;
    }
    void SetTimer(UINT t_size)
    {
        timer   =   clock() + t_size;
    }
    void UpdateObject(LPDIRECT3DDEVICE9 &pd3dDevice, 
                                        LPCWSTR sleep_,
                                        LPCWSTR activ_,
                                        LPCWSTR down_, 
                                        float x1, 
                                        float y1, 
                                        float z1, 
                                        float x2,
                                        float y2,
                                        float z2,
                                        float z3,
                                        float z4)
    {
        Down        = false;
        status      = 0;
        g_pVB       =   NULL;
        sleep       =   NULL;
        activ       =   NULL;
        down        =   NULL;
        D3DXCreateTextureFromFile(pd3dDevice,sleep_, &sleep);
        D3DXCreateTextureFromFile(pd3dDevice,activ_, &activ);
        D3DXCreateTextureFromFile(pd3dDevice,down_ , &down);
        Rectangle   = *new D3DRectangle(x1, y1, z1, x2, y2, z2, z3, z4);
    }
 
    LPDIRECT3DTEXTURE9 getTexture()
    {
        if(status == 0) return sleep;
        if(status == 1) return activ;
        if(status == 2) return down;
    }
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
        pd3dDevice->SetFVF              ( D3DFVF_CUSTOMVERTEX );
        pd3dDevice->SetStreamSource     ( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
 
        if(FAILED(pd3dDevice->SetTexture    (0, getTexture())))             return false;
        if(FAILED(pd3dDevice->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 2)))    return false;
 
        return true;
    }
};
Это означает, что где-то в коде main вы пытаетесь создать объект базового класса. Можно использовать лишь указатель на базовый класс или ссылку.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:36     ООП + полиморфизм = wtf? #29
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вызов деструктора из детей пойдет?
Пойдёт из детей, только деструктор должен быть объявлен в базовом классе как виртуальный. Для полиморфных классов это обязательно, кстати.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 20:47  [ТС]     ООП + полиморфизм = wtf? #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
Пойдёт из детей, только деструктор должен быть объявлен в базовом классе как виртуальный. Для полиморфных классов это обязательно, кстати.
Окей, спасибо большое!)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 20:50     ООП + полиморфизм = wtf? #31
Цитата Сообщение от BAIZOR Посмотреть сообщение
А вызов деструктора из детей пойдет?
Я вот только сейчас понял, что эту фразу можно прочитать несколькими способами
Я имел в виду, что при удалении объекта по базовому указателю с помощью delete, будет вызван деструктор наследника, при условии что деструктор виртуальный. Надеюсь в вопросе было это
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:33  [ТС]     ООП + полиморфизм = wtf? #32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Я имел в виду, что при удалении объекта по базовому указателю с помощью delete, будет вызван деструктор наследника, при условии что деструктор виртуальный. Надеюсь в вопросе было это
да да) я просто стараюсь говорить проще, а то достало когда люди меня не понимают

Добавлено через 19 минут
Господа... а у меня программа падает на вызове такоей же функции, только она с названием Render();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main()
{
        vector<D3D_UI*>             UI;
        UI.push_back( &D3DXButton(...) );
        UI[0]->Render(); [COLOR="Red"]//вылетело - зависло[/COLOR]
}
 
class D3D_UI
{
public:
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice) = 0;
};
 
class D3DXButton : public D3D_UI
{
public:
    bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
              ....
        }
};
Сыроежка
Заблокирован
27.08.2011, 21:35     ООП + полиморфизм = wtf? #33
Цитата Сообщение от BAIZOR Посмотреть сообщение
да да) я просто стараюсь говорить проще, а то достало когда люди меня не понимают

Добавлено через 19 минут
Господа... а у меня программа падает на вызове такоей же функции, только она с названием Render();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main()
{
        vector<D3D_UI*>             UI;
        UI.push_back( &D3DXButton(...) );
        UI[0]->Render(); [COLOR="Red"]//вылетело - зависло[/COLOR]
}
 
class D3D_UI
{
public:
    virtual bool Render(LPDIRECT3DDEVICE9 &pd3dDevice) = 0;
};
 
class D3DXButton : public D3D_UI
{
public:
    bool Render(LPDIRECT3DDEVICE9 &pd3dDevice)
    {
              ....
        }
};
В режиме отладки пройдитесь по предложениям вашей функции и посмотрите, где она виснет!
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 21:38     ООП + полиморфизм = wtf? #34
Цитата Сообщение от BAIZOR Посмотреть сообщение
UI.push_back( &D3DXButton(...) );
В вектор помещается адрес временного объекта, который тут же уничтожается.

Добавлено через 1 минуту
Правда сомнения у меня, что такое может компилироваться

Добавлено через 1 минуту
Но, к сожалению, компилируется.
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:42  [ТС]     ООП + полиморфизм = wtf? #35
Цитата Сообщение от Сыроежка Посмотреть сообщение
В режиме отладки пройдитесь по предложениям вашей функции и посмотрите, где она виснет!
"Виснет" именно на вызове, не в ней, а на вызове.


Цитата Сообщение от grizlik78 Посмотреть сообщение
В вектор помещается адрес временного объекта, который тут же уничтожается.
я так и думал... но как же это обойти?

может как то так

C++
1
UI.push_back( &*&D3DXButton(...) );
если только скомпилируеться.. =)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 21:43     ООП + полиморфизм = wtf? #36
new/delete
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:44  [ТС]     ООП + полиморфизм = wtf? #37
Цитата Сообщение от BAIZOR Посмотреть сообщение
Код C++
1
UI.push_back( &*&D3DXButton(...) );
если только скомпилируеться.. =)
скомпилировалось.. но эффект тот же

Добавлено через 20 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
new/delete
сейчас попробую...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 21:45     ООП + полиморфизм = wtf? #38
Избавиться от необходимости delete можно с помощью "умных" указателей. А вот от new избавиться не удастся. Не переменные же отдельные создавать
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
27.08.2011, 21:46  [ТС]     ООП + полиморфизм = wtf? #39
C++
1
UI.push_back( new D3DXButton (...) );
Ура!) Выручили внатуре!! =)

Добавлено через 1 минуту
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 21:49     ООП + полиморфизм = wtf?
Еще ссылки по теме:

ООП. Полиморфизм C++
C++ map assigment of read only data member или WTF?
C++ Полиморфизм инкапсуляция и наследование(ООП)

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.08.2011, 21:49     ООП + полиморфизм = wtf? #40
Цитата Сообщение от BAIZOR Посмотреть сообщение
поидеи вызов UI.clear(); должен вызвать деструкторы всех деток и после почистить их память?
Нет, он просто удалит указатели, не разрушая сами объекты. Умные указатели при разрушении сами удалят объекты (только std::auto_ptr здесь никак не подойдёт). А с простыми указателями надо в цикле удалять все объекты ручным вызовом delete.
Yandex
Объявления
27.08.2011, 21:49     ООП + полиморфизм = wtf?
Ответ Создать тему
Опции темы

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