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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
#1

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

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

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

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

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

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

Динамический массив указателей на объекты - C++
вообщем была тут на форуме задача, в подробности вдаваться не буду, смысл сейчас заключается в том, чтобы создавать в цикле объекты, и в их...

Поместить данные в динамический массив - C++
Как запомнить char динамический массив при описе? char **map = new char * ; for (int i=0;i<sizey;i++) { map=new char ; } map = ...

Динамический массив указателей на объекты класса - C++
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...

6
nmcf
5324 / 4644 / 1553
Регистрация: 14.04.2014
Сообщений: 18,479
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║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.05.2014, 18:23 #4
Inferiym, Страуструп бы не одобрил. У тебя, просто, "спагетти код", как его называют.

Опиши задачу в отрыве от существующего кода. Только опиши на каком то одном языке или русском, или украинском, не надо их перемешивать, у вас в коде каши достаточно.
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,388
Завершенные тесты: 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(); // Вызов из производного класса
1
Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
20.05.2014, 20:44  [ТС] #6
Хорошо спасибо .. но э одно но .. При определенных обстоятельствах, я эти объекты передаю в обычный массив! Его заменить динамический? ... Но его 4 дня настраивал ...
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,388
Завершенные тесты: 1
20.05.2014, 21:04 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Копировать производный объект в базовый без явного приведения типа запрещено,
а присваивать указатель сам Бог велел!
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 21:04
Привет! Вот еще темы с ответами:

Считать строки файла и поместить в динамический массив строк - C++
Ребята помогите. Нужно считать с файла, в котором 1 строка - 1 слово, строки и поместить их в динамический массив строк типа char...

Динамический массив объектов - C++
Как определить объект Group, который будет содержать динамический массив объектов Person?

динамический массив объектов - C++
помогите с функцией PrintGarage, чтоб она выводила массив объектов Garage int main(){ char model; int number = 0; int run =...

Динамический массив объектов класса - C++
Здравствуйте. Возник вопрос, на который не получается найти понятного ответа. Есть класс Point: #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
20.05.2014, 21:04
Ответ Создать тему
Опции темы

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