Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
1

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

20.05.2014, 17:29. Просмотров 902. Ответов 6
Метки нет (Все метки)

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

Как создать класс контейнер-динамический массив и поместить туда объекты других классов?
Какой тип массива использовать тип базового класса или наследников?

Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?

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

Удалить все объекты и создать объекты - потомки
Как сделать клоны объекта в другом объекте? Использую метод Instantiate Есть метод public...

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

6
nmcf
6522 / 5748 / 2619
Регистрация: 14.04.2014
Сообщений: 24,493
20.05.2014, 18:03 2
Понятнее объясни. С примерами.
0
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);
        };
        
    };
Я хочу создать два класса нащадки и добавить в етот же масив
0
outoftime
║XLR8║
778 / 678 / 213
Регистрация: 25.07.2009
Сообщений: 3,392
Записей в блоге: 5
20.05.2014, 18:23 4
Inferiym, Страуструп бы не одобрил. У тебя, просто, "спагетти код", как его называют.

Опиши задачу в отрыве от существующего кода. Только опиши на каком то одном языке или русском, или украинском, не надо их перемешивать, у вас в коде каши достаточно.
0
zss
Модератор
Эксперт С++
7770 / 7005 / 4396
Регистрация: 18.12.2011
Сообщений: 18,523
Завершенные тесты: 1
20.05.2014, 18:41 5
Лучший ответ Сообщение было отмечено Inferiym как решение

Решение

Поскольку у вас имеется массив указателей на базовый класс,
то их можно инициализировать адресами Производных классов.
Только имейте ввиду, что из производных классов вызывать можно будет
только виртуальные методы (т.е. в базовом классе надо их предусмотреть).
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(); // Вызов из производного класса
1
Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
20.05.2014, 20:44  [ТС] 6
Хорошо спасибо .. но э одно но .. При определенных обстоятельствах, я эти объекты передаю в обычный массив! Его заменить динамический? ... Но его 4 дня настраивал ...
0
zss
Модератор
Эксперт С++
7770 / 7005 / 4396
Регистрация: 18.12.2011
Сообщений: 18,523
Завершенные тесты: 1
20.05.2014, 21:04 7
Лучший ответ Сообщение было отмечено Inferiym как решение

Решение

Копировать производный объект в базовый без явного приведения типа запрещено,
а присваивать указатель сам Бог велел!
1
20.05.2014, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 21:04

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

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты?
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции...

Где и как создать массив объектов, чтобы можно было получить доступ к методам этих объектов?
Задача: &quot;в win form кликаю на кнопку (button) и в этот момент в одном из массивов экземпляров...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru