Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


Ќаследование и работа с пам€тью в STL




ћы рассмотрели хранение данных в виде объектов внутри STL-ных контейнеров. ќднако часто данные хран€тс€ там не по значению, а по адресу.  ак вы знаете из курса ассемблера Ц адрес это Int. STL-ные типы не умеют освобождать автоматически пам€ть при удалении адресов таких типов, по вполне очевидным причинам:

1) vector<int*>: вектор не знает, что элемент int* это единичный элемент в динамической пам€ти или массив таких объектов.

2)  огда объект создаетс€ вовне, то и код удалени€, очевидно, должен где-то снаружи контейнерного типа находитс€.

ƒавайте рассмотрим пример: мы делаем какую-то игру, в которой часть объектов, допустим, может двигатьс€, а часть Ц нет.

#include "stdafx.h"

#include <iostream>

#include <exception>

#include <list>

#include <conio.h>

 

using namespace std;

 

class Drawable

{

public:

virtual void Draw() = 0;

virtual ~Drawable() {};

};

 

class Movable

{

public:

virtual void Update(int deltaTMsec) = 0;

virtual ~Movable() {};

};

 

class Fish: public Drawable, public Movable

{

private:

int m_x;

int m_y;

static const int Speed = 600;

public:

Fish(int x, int y): m_x(x), m_y(y)

{

}

 

virtual void Update(int deltaTMsec)

{

cout << "Moving fish!\n";

m_x += deltaTMsec*Speed;

m_y += deltaTMsec*Speed;;

}

 

virtual void Draw()

{

cout << "Redrawing fish!\n";

}

};

 

class Hero: public Drawable, public Movable

{

private:

int m_x;

int m_y;

static const int Speed = 13;

public:

Hero(int x, int y): m_x(x), m_y(y)

{

}

 

virtual void Update(int deltaTMsec)

{

cout << "Moving hero!\n";

m_x += deltaTMsec*Speed;

m_y += deltaTMsec*Speed;;

}

 

virtual void Draw()

{

cout << "Redrawing hero!\n";

}

};

 

class Wall: public Drawable

{

private:

int m_x;

int m_y;

public:

Wall(int x, int y): m_x(x), m_y(y)

{

}

 

virtual void Draw()

{

cout << "Redrawing wall!\n";

}

};

 

int _tmain(int argc, _TCHAR* argv[])

{

auto fish = new Fish(13, 20);

auto mainHero = new Hero(13, 13);

auto wall = new Wall(33, 33);

 

list<Drawable*> drawableItems = { fish, mainHero, wall };

list<Movable*> movableItems = { fish, mainHero };

list<void*> allGameObjects = { fish, mainHero, wall };

 

// the main game circle

while (!_kbhit()) // not the end of the world!

{

for (Drawable* drawable: drawableItems)

drawable->Draw();

 

for (Movable* movable: movableItems)

movable->Update(13);

}

 

// clean memory

for (auto gameObjectIterator = allGameObjects.begin();

gameObjectIterator!= allGameObjects.end();)

{

delete *gameObjectIterator;

gameObjectIterator = allGameObjects.erase(gameObjectIterator);

}

drawableItems.clear();

movableItems.clear();

 

return 0;

}

«десь показано, как удал€ть объекты в динамической пам€ти. ѕоскольку вы€снилось, что хочетс€ завести несколько коллекций в зависимости от возможностей объектов: одна дл€ того, чтобы перерисовывать, друга€ Ц двигать, в которой объекты могут повтор€тс€, то соответственно решили завести еще одно общую коллекцию: в которой есть все объекты игрового мира: обратите внимание, как происходит удаление оттуда элементов. ќстальные коллекции в дальнейшем просто очищаютс€.

ќбратите внимание также на полиморфизм в обоих контейнерах: мы делаем контейнер адресов на базовый класс, а работаем с его наследниками, ожида€ функционал, который есть пообещал базовый класс.





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-05-05; ћы поможем в написании ваших работ!; просмотров: 434 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

—лабые люди всю жизнь стараютс€ быть не хуже других. —ильным во что бы то ни стало нужно стать лучше всех. © Ѕорис јкунин
==> читать все изречени€...

2011 - | 1953 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.009 с.