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

Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? - C++

Восстановить пароль Регистрация
 
Inferiym
 Аватар для Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
20.05.2014, 17:29     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #1
У меня есть объекты, очень сложные объекты. Они постоянно относятся то одному то другому массива, они постоянно выполняют большое количество операций.Але мне нужно создать два класса нащадки.И все Операции продублировать ... или можна как-то поместить их в один массив с объектами родительского класса или придется делать это по новой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2014, 17:29     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив?
Посмотрите здесь:

Динамический массив объектов C++
C++ динамический массив объектов
C++ Динамический массив объектов
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
C++ Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
20.05.2014, 18:03     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #2
Понятнее объясни. С примерами.
Inferiym
 Аватар для Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
20.05.2014, 18:11  [ТС]     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #3
у меня есть масив
C++
1
skydiver **mas=new skydiver*[40];
добавлять новий елемент в него
C++
1
2
3
 mas[0]=new skydiver("Михайло",200,500,0,0);all++;
mas[1]=new skydiver("Олександр",400,500,0,0);all++;
mas[2]=new skydiver("Тимур",700,280,400,0);all++;
Клас обэктов очень сложний
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
#pragma once
#include "StdAfx.h"             
 
class skydiver
    {
    friend class land;
    private:
        int n;                  //Номер
        POINT lastpoz;          //Координати останньої позиції для затирання
        POINT poz;              //Координати позиції
        POINT v;                //Вектор руху (для таймера)
        char he_is[20];         //Ім'я
        bool select;            //Індекатор виділення
    public:
        //Конструктор з параметрами
        skydiver (char *_he_is,int x,int y,int xv,int yv)
        {
            strcpy(this->he_is,_he_is);
            poz.x=lastpoz.x=x;
            poz.y=lastpoz.y=y;
            v.x=xv;
            v.y=yv;
            select=false;
        }
        skydiver()
        {   
            char *_he_is="Новий";
            strcpy(this->he_is,_he_is);
            poz.x=(400+rand () % 600);
            poz.y=(280+rand () % 50);
            v.x=-3;
            v.y=3;
            select=false;
        }
        
        //Методи надання даних
        char* getname()             {return this->he_is;}
        bool sel()                  {return this->select;}
        int getpozx()               {return this->poz.x;}
        int getpozy()               {return this->poz.y;}
        void givepoz(int x,int y)   {lastpoz.x=poz.x; poz.x=x; lastpoz.y=poz.y; poz.y=y;}
        //Mетод інверсії виділення
        void selnow()           {if (select==0) select=1; else select=0;}
        //Підрівняти до краю екрана
        void dobetter(int a)    {lastpoz.y=poz.y; poz.y=a;}
        //Відміна виділення
        void selfalse()         {select=0;}
        //Методи переміщення
        void left() {lastpoz.x=poz.x; poz.x-=4;}
        void right(){lastpoz.x=poz.x; poz.x+=4;}
        void up()   {lastpoz.y=poz.y; poz.y-=4;}
        void down() {lastpoz.y=poz.y; poz.y+=4;}
        void graw(int bottom) 
            {   
                lastpoz.x=poz.x;
                lastpoz.y=poz.y;
                poz.x+=rand () % 4;
                poz.y+=4; 
            }
        //Метод який визначає чи знаходиться курсор на обєкті
        bool inme (int x,int y)
        {
            if ((x>=poz.x)&&(x<=poz.x+100)&&(y>=poz.y)&&(y<=poz.y+150)) return true;
            else return false;
        }
        //Метод зображення обєкту//
        void draw(HDC hdc,HBITMAP jetpack1,HBITMAP jetpack2,
            HBITMAP _jetpack1,HBITMAP _jetpack2,HBITMAP skydiver_new,bool a,bool r_or_l)
        {
        HDC hdcMem=CreateCompatibleDC(hdc);
        // Виділення парашутиста проявляється у тому що у нього з'являється реактивний ранець
        // це цілком виправдовує той факт, що парашутис отримує можливість керувати траекторією
        // і навіть летіти в гору.
        HPEN delpen=CreatePen(PS_SOLID,1,RGB(255,255,255));
        HBRUSH delbrush = CreateSolidBrush (RGB(255,255,255));
        (HPEN)SelectObject(hdc,delpen);
        (HBRUSH)SelectObject(hdc,delbrush);
        Rectangle(hdc,lastpoz.x-4,lastpoz.y-30,lastpoz.x+108,lastpoz.y+154);        ///Очищення зайвого
        
        TextOutA(hdc,poz.x+10,poz.y-22,LPCSTR(this->getname()),strlen(this->getname()));
        if (select){
            if(r_or_l)
                if (a){
                SelectObject(hdcMem,jetpack1);
                BitBlt(hdc,poz.x,poz.y+1,100,150,hdcMem,0,0,SRCCOPY);
                }   
                else{
                SelectObject(hdcMem,jetpack2);
                BitBlt(hdc,poz.x,poz.y-1,100,150,hdcMem,0,0,SRCCOPY);
                }               
        else
                if (a){
                SelectObject(hdcMem,_jetpack1);
                BitBlt(hdc,poz.x,poz.y+1,100,150,hdcMem,0,0,SRCCOPY);
                }   
                else{
                SelectObject(hdcMem,_jetpack2);
                BitBlt(hdc,poz.x,poz.y-1,100,150,hdcMem,0,0,SRCCOPY);
                }
        TextOutA(hdc,poz.x,poz.y,LPCSTR("(Виділений)"),11);
        }
        else{   
        SelectObject(hdcMem,skydiver_new);
        BitBlt(hdc,poz.x,poz.y+1,100,150,hdcMem,0,0,SRCCOPY);       
        }
        DeleteDC(hdcMem);
        };
        
    };
Я хочу создать два класса нащадки и добавить в етот же масив
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.05.2014, 18:23     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #4
Inferiym, Страуструп бы не одобрил. У тебя, просто, "спагетти код", как его называют.

Опиши задачу в отрыве от существующего кода. Только опиши на каком то одном языке или русском, или украинском, не надо их перемешивать, у вас в коде каши достаточно.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
20.05.2014, 18:41     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Поскольку у вас имеется массив указателей на базовый класс,
то их можно инициализировать адресами Производных классов.
Только имейте ввиду, что из производных классов вызывать можно будет
только виртуальные методы (т.е. в базовом классе надо их предусмотреть).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class skydiver
{
 ...
virtual void draw(.... // метод базового класса
};
class great_skydiver:public skydiver
{
 ...
    virtual void draw(.... // метод производного класса
}
...
mas[0]=new skydiver("Михайло",200,500,0,0);all++;
mas[1]=new great_skydiver("Олександр",400,500,0,0);all++;
mas[2]=new great_skydiver("Тимур",700,280,400,0);all++;
mas[0]->draw();// Вызов из базового класса 
mas[1]->draw(); // Вызов из производного класса
mas[2]->draw(); // Вызов из производного класса
Inferiym
 Аватар для Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
20.05.2014, 20:44  [ТС]     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #6
Хорошо спасибо .. но э одно но .. При определенных обстоятельствах, я эти объекты передаю в обычный массив! Его заменить динамический? ... Но его 4 дня настраивал ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 21:04     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив?
Еще ссылки по теме:

C++ динамический массив указателей на объекты
C++ Поместить данные в динамический массив
C++ Динамический массив динамических объектов

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
20.05.2014, 21:04     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Копировать производный объект в базовый без явного приведения типа запрещено,
а присваивать указатель сам Бог велел!
Yandex
Объявления
20.05.2014, 21:04     Возможно ли объекты и потомки этих объектов поместить в один и тот же динамический массив?
Ответ Создать тему
Опции темы

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