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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
#1

stl и полиморфизм - C++

21.01.2012, 15:05. Просмотров 1207. Ответов 22
Метки нет (Все метки)

Всем доброго времени суток, возник такой вопрос не знаю как реализовать,
имеется 4 класса.
Базовый Object он имеет поля x и y от него наследуется класс Enemy он имеет метод Draw -прорисовка, от этого класса наследуется ещё 2 класса Bomber и destroyer они имеют методы Update которые обновляют координаты объекта а также имеют булеву переменную alive которая проверяет жив ли объект,
в main я использую такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CDestroyer destr[3];
    destr[0].Init(300,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
    destr[1].Init(370,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
    CBomber bomber;
    bomber.Init(400,300,0,0,32,32,"images\\Enemies\\bomber.bmp",1,2);
    CEnemy **enemy;
    enemy=new CEnemy*[3];
    enemy[0]=&destr[0];
    enemy[1]=&destr[1];
    enemy[2]=&bomber;
while(true)
{
               enemy[0]->Update(player.lightlaser.GetX(),player.lightlaser.GetY());
           enemy[1]->Update(player.lightlaser.GetX(),player.lightlaser.GetY());
           enemy[2]->Update(player.lightlaser.GetX(),player.lightlaser.GetY());
                enemy[0]->Draw(buffer);
        enemy[1]->Draw(buffer);
        enemy[2]->Draw(buffer);
 
}
Как это реализовать с помощью очереди(думаю она здесь подойдёт как нельзя лучше)
а также если у объекта alive=false, то чтоб этот объект удалился.
STL юзал буквально несколько раз, поэтому незнаю как это можно провернуть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос stl и полиморфизм (C++):

STL и полиморфизм - C++
Доброго времени суток! Исходная информация: класс а-базовый,b-производный у этих ребят определён виртуальный метод(для класса "a"...

Полиморфизм - C++
Я хотел реализовать множество, используя множественное наследование, но когда написал template <class T> class set { protected: ...

Полиморфизм - C++
Хай :senor: class MyPrint//производный класс { public: MyPrint() { cout << "Constructor MyPrint" << endl; } virtual...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

Полиморфизм - C++
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать...

Полиморфизм - C++
не могу разобраться с полиморфизмом((( Вот как мне вычислить трапеции. У нее ведь три параметра, а не два как у прямоугольника???? ...

22
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:37 #16
ну я вроде написал что после ерейза итератор становится невалидным. обращатся к нему уже нельзя. а у вас в коде идет удаление, а потом обращение к этому итератору. удалите сперва из контейнера все мертвые обхъекты, а потом уже в цикле апдейт зовите. если же хотите в одном цикле удалять и апдейтить, то придется подправлять итераторы после удаления чего-либо из контейнера

апдейт поместите рядом с дроу, в цикл, где идет перебор живых врагов.
0
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
21.01.2012, 18:40  [ТС] #17
Та даже если я ничего не удаляю(удаление полностью комментировал) всё равно debug error выкидывает когда приложение закрывается.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:44 #18
ну тогда весь код проще сюда выложить.
0
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
21.01.2012, 18:45  [ТС] #19
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
volatile long counter=0;
void increment()
{
    counter++;
}
#include"allegro\include\allegro.h"
#include"defines.h"
#include"Player.h"
#include"Destroyer.h"
#include "Bomber.h"
#include<vector>
using std::vector;
bool IsDead(const CEnemy& enemy)
{
  return !enemy.alive;
}
int main(void)
{
    allegro_init();
    install_keyboard();
    install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"A");
    MIDI * fon;
    fon=load_midi("sounds\\1 (8).mid");
    play_midi(fon,true);
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,WinWidth,WinHeight,0,0);
    set_window_title("Space Invaders");
    LOCK_VARIABLE(counter);
    LOCK_FUNCTION(increment);
    install_int_ex(increment,BPS_TO_TIMER(100));
    BITMAP * buffer=create_bitmap(WinWidth,WinHeight);
    BITMAP* bg=load_bitmap("images\\background\\Level_6.bmp",NULL);
    CDestroyer destr[3];
    destr[0].Init(300,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
    destr[1].Init(370,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
    destr[2].Init(400,300,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
    CBomber bomber;
    bomber.Init(400,300,0,0,32,32,"images\\Enemies\\bomber.bmp",1,2);
    CEnemy **enemy;
    enemy=new CEnemy*[3];
    enemy[0]=&destr[0];
    enemy[1]=&destr[1];
    enemy[2]=&bomber;
     std::vector <shared_ptr<CEnemy>> lst; 
     lst.insert(lst.end(),enemy,enemy+3);
     std::vector <shared_ptr<CEnemy>>:: iterator iter;
     iter=lst.begin();
     
 
    bool done=false;
    CPlayer player;
    int g=700,j=0;
    player.Init(400,400,0,Down,32,32,"images\\mainShip\\mths.bmp",1,2);
    while(!done)
    {
        while(counter>0)
        {
            if(key[KEY_ESC])
                done=true;
            player.Update();
            for(iter=lst.begin();iter!=lst.end();iter++)
            {
                if((*iter)->alive==false)
                    lst.erase(iter);
                (*iter)->Update(player.lightlaser.GetX(),player.lightlaser.GetY());
            }
            counter--;  
        }
        j++;
        if(g>=-350&&j%4==0)
        {
            g--;
        }
        if(g==-350)
        {
            g=900;
            
        }
        blit(bg,buffer,0,g,0,0,WinWidth,WinHeight);
        player.Draw(buffer);
        for(iter=lst.begin();iter!=lst.end();iter++)
            {
                (*iter)->Draw(buffer);
            }
        blit(buffer,screen,0,0,0,0,WinWidth,WinHeight);
        clear_bitmap(buffer);
    }
    return 0;
}
END_OF_MAIN()
Надеюсь классы вылаживать не нужно))
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:50 #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        CDestroyer destr[3];
        destr[0].Init(300,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
        destr[1].Init(370,200,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
        destr[2].Init(400,300,0,0,32,32,"images\\Enemies\\destrojer.bmp",1,2);
        CBomber bomber;
        bomber.Init(400,300,0,0,32,32,"images\\Enemies\\bomber.bmp",1,2);
        CEnemy **enemy;
        enemy=new CEnemy*[3];
        enemy[0]=&destr[0];
        enemy[1]=&destr[1];
        enemy[2]=&bomber;
         std::vector <shared_ptr<CEnemy>> lst; 
         lst.insert(lst.end(),enemy,enemy+3);
В вектор вы складываете шаред поинтеры, которые инициализируются указателями на объекты, которые у вас на стеке.
Когда вызывается деструктор вектора, он удаляет все свое содержимое, все шаред поинтеры. Каждый шаред поинтер, когда удаляется, вызывает делете для того указателя, на который он указывает. Далее у вас удаляются те же самые объекты, которые на стеке. Итого получаем двойное удаление одних и тех же объектов.
0
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
21.01.2012, 18:55  [ТС] #21
А как это полечить?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2012, 18:59 #22
например складывать все сразу в вектор без всяких промежуточных массивов.

C++
1
2
3
4
5
6
7
8
9
10
11
std::vector <shared_ptr<CEnemy>> lst;
shared_ptr<CDestroyer> destroyer;
destroyer.reset(new CDestroyer());
destroyer->Init(...);
lst.push_back(destroyer); // тут возможно понадобится явное преобразование в shared_ptr<CEnemy>
 
destroyer.reset(new CDestroyer());
destroyer->Init(...);
lst.push_back(destroyer);
 
//тут то же самое для бомбера
1
revaldo666
9 / 9 / 1
Регистрация: 18.07.2010
Сообщений: 180
21.01.2012, 19:22  [ТС] #23
Спасибо работает, а как теперь удалить? при alive == false
Попробовал тем методом что вы писали, не получается...

Добавлено через 11 минут
Всем спасибо за ответы, с удалением разобрался,
надо было так
C++
1
2
3
4
5
if((*iter)->alive==false)
        {
            lst.erase(iter);
            break;
        }
0
21.01.2012, 19:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2012, 19:22
Привет! Вот еще темы с ответами:

Полиморфизм - C++
Прочитал в Википедии что такое полиморфизм: Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». ...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

Полиморфизм. - C++
Доброго времени суток. Помогите решить следующую задачку: Создать класс периодическое издание (название, стоимость экземпляра и...


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

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

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