Как я могу написать динамическую гетерогенную коллекцию внутри C++ без использования STL?
В основном мне приходится динамически хранить разные фильмы в гетерогенной коллекции, у меня уже есть разные типы фильмов (документальные и семейные) и класс, который "маскирует" разницу (фильм), чтобы его можно было хранить в одном месте (запись). У меня проблемы с функцией addMovie (Movie * mov). Не знаю, с чего начать.
Мой класс записи:
class Record {
String name;
size_t siz;
Movie* movies;
Record(const Record&);
Record& operator=(const Record&);
public:
Record(String n): name(n), siz(0) {movies = new Movie[siz+1];}
void addMovie (Movie *mov);
void removeMovie (Movie *mov);
void listMovies();
void searchMovie (const char* title);
void emptyRecord();
void writeFile();
void readFile();
virtual ~Record() {emptyRecord();}
};
Класс фильма:
class Movie {
protected:
String name;
String release;
String genre;
public:
Movie(){}
Movie(String n, String r, String g): name(n), release(r), genre(g) {}
virtual void write() {}
virtual ~Movie() {}
};
Документальный класс: (семейный класс похож, он хранит int age_restriction, и функция записи записывает это)
class Documentary: public Movie {
String description;
public:
Documentary(String n, String r, String d = "Add description up to 50 characters!"): Movie(n,r,"Documentary"), description(d) {}
String getDescription () const {return description;}
void setDescription (String newdescr);
void write();
virtual ~Documentary(){}
};
(PS: если у вас есть хорошие источники для динамических разнородных магазинов, я все слышу)
1 ответ
Не очень четкие требования, но для хранения разнородных данных в одном контейнере я бы посоветовал std::tuple (https://en.cppreference.com/w/cpp/utility/tuple). Дайте мне знать, если это то, что вы искали;)
РЕДАКТИРОВАТЬ: возможное решение без STL.
#include <iostream>
using namespace std;
class Base {
};
class A : public Base {
};
class B : public Base {
};
int main(){
const size_t arraySize = 10;
Base* array[arraySize];
//allocate
array[0] = new A();
array[1] = new B();
// ...some more stuff here
//dispose
for (Base* ptr : array) {
if (ptr != nullptr) {
delete ptr;
ptr = nullptr;
}
}
}