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

У меня есть базовый класс Product и производные классы Book, Magazine а также MusicCD, Я хочу сохранить указатели на эти объекты в одном массиве в основном, контейнере и т. Д.

int main()
{
Product* pro[100];
pro[0] = new Book();
pro[1] = new Magazine();
pro[2] = new MusicCD();
}

Размер pro 100, но я не хочу статический размер. Продукты заданы по умолчанию и используются только пользователем. Если я хочу добавить больше объектов, я должен сделать это вручную pro[68], pro[69]…?

-3

Решение

Стандартная библиотека C ++ предоставляет как расширяемые контейнеры, так и более безопасные способы работы с указателями. Я предлагаю вам использовать оба. std::vector изменяет размеры по мере необходимости, а построенный, как я покажу ниже, будет очищать как себя, так и указатели внутри, когда главные выходы.

#include <memory>
#include <vector>

int main(){
std::vector<std::shared_ptr<Product> > products;
//C++11
products.emplace_back(new Book());
products.emplace_back(new Magazine());

//C++03TR1 (VS 2010 and older GCC)
// we don't have emplace_back here so we need to
// construct both the shared_ptr and the book if the book
// constructor takes arguments
// otherwise we can use the slightly more exception safe std::make_shared
products.push_back(std::make_shared<Book>());
}
3

Другие решения

Вы можете использовать один из стандартных контейнеров C ++, например, vector.

#include <vector>

class Product{
};

class Book : public Product{
};

class Magazine : public Product{
};

class MusicCD : public Product{
};int main(){

std::vector<Product *> pro;

pro.push_back(new Book);
pro.push_back(new Magazine);
pro.push_back(new MusicCD);}
0

Стандартная библиотека имеет множество универсальных контейнеров переменного размера, которые вам обязательно помогут. Увидеть http://www.cplusplus.com/reference/stl/.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector