C++ создание массива объектов (из разных классов)
мне нужно создать массив, который содержит объекты нескольких классов.
пример
class baseClass
{
//
};
class first : baseClass
{
//
};
class second : baseClass
{
//
};
как создать массив, который может содержать first
и/или second
объект внутри него?
это несколько домашняя задача для меня, поэтому я вынужден использовать массивы, я уже искал и знаю, что это делается с библиотеками boost, но у меня нет выбора здесь, ребята...
3 ответов
baseClass *array[10];
baseClass **array2 = new baseClass *[size];
это самый простой и опасный способ. Вы должны быть осторожны с временем жизни объектов, чтобы избежать утечки или двойного освобождения. Вы также должны быть осторожны с распределением и освобождением массива, особенно если вам нужно изменить размер во время выполнения.
std::vector<baseClass*> vec;
это улучшает предыдущий пример, потому что вектор обрабатывает память массива для вас, но вы все равно должны быть осторожны с baseClass указатели.
std::vector<boost::variant<first,second> > vec2;
это еще одно улучшение, которое устраняет необходимость вручную выделять или освобождать память для объектов, и это безопасно с точки зрения доступа к объектам в качестве первых или секунд. Нельзя перепутать один предмет с другим.
std::vector<std::unique_ptr<baseClass>> vec3;
С помощью этой опции вы все равно можете путать объекты разных типов друг для друга, но он использует только стандартную библиотеку, и вам все равно не нужно управлять временем жизни объектов, которые вы выделяете. Однако он использует C++11.
также, если вам не нужен динамический массив, вы можете использовать std::array<...,size>
std::array<std::unique_ptr<baseClass>,10> array3;
имеет абсолютно нулевое пространство или время накладных расходов во время выполнения над baseClass *array[10];
, и намного безопаснее. (нулевые накладные расходы, при условии достойной реализации)
наилучшей практикой для этого было бы создание массива интеллектуальных указателей - предпочтительно одной из версий Boost или C++11 - для базового класса. Создание массива указателей исключает риск "нарезки" ваших объектов при доступе к ним. Использование интеллектуальных указателей снижает риск утечки памяти. Сделать его указателем базового класса означает, что любой производный класс может храниться там безопасно.
Если вы не можете использовать библиотеки, вам нужен массив указателей типа:
baseClass *array[123];
array[0] = new first();
array[1] = new second();
и никакой отрезать не произойдет. (не забудьте delete
все)