Буду признателен за любую помощь в этом.
У меня есть простой шаблон класса контейнера Dataset.
Также есть специализация, позволяющая использовать другую реализацию, когда создается экземпляр набора данных.
Поскольку набор данных из набора данных будет гетерогенным контейнером, существует базовый абстрактный класс List, который должен объявлять общий интерфейс для каждого набора данных.Это было бы get ().
Проблема в том, что я не могу указать тип возврата в List :: get (), поэтому мне нужно переопределить возвращение void * в потомках.
I´мы прочитали следующие ограничения ковариации:
• Функция B :: f возвращает ссылку или указатель на класс типа T, а A :: f возвращает> указатель или ссылку наоднозначный прямой или косвенный базовый класс T.
• Константная или переменная квалификация указателя или ссылки, возвращенная B :: f, имеет такую же или менее постоянную или изменчивую квалификацию указателя или ссылки, возвращенную A :: f.
• Тип возврата B :: f должен быть полным в точке объявления B :: f, или он может иметь тип B.
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr139.htm
Что ж, заставлять содержащиеся объекты происходить из одного и того же базового класса бесполезно для меня.
Итак, есть ли обходной путь к этому?А еще лучше: как правильно это сделать с ++?
Если вам интересно, то, что я пытаюсь сделать, это, так сказать, «реляционный контейнер».Но вы все равно не увидите реляционную часть в приведенном ниже коде.
Цель состоит в том, чтобы хранить данные, оставляя контейнер не осведомленным о каких-либо отношениях между списком.Тогда я бы сохранил отношения в списке отдельно.Например:
Список людей
0 Джон
1 Артур
2 Кэролайн
Список автомобилей
0 - Ford
1 - Volkswagen
2- Chrysler
Список отношений
0 - 1; 2
1 - 0; 1
2 - 0; 2
Почти как реляционная база данных.Кроме того, у меня есть незначительные побочные проблемы, такие как создание set () для приема maxsize количества аргументов.Не удалось этого добиться с помощью va_list.Может быть, я все равно прошел через это.
Заключительный пункт: я намеренно избегаю STL для обучения, НО, если уже есть такая функциональность, я хотел бы знать.
Большое спасибо!
Theкод ниже:
#include <iostream>
using namespace std;
//--------------------------------------------------//
// TRIVIAL DUMMY CLASSES
class Person
{
public:
Person(char* n, unsigned int a): _name(n), _age(a){}
char* name(){cout << "Im " << _name << endl; return _name;}
unsigned int age(){cout << "Im " << _age << " years old." << endl; return _age;}
private:
char* _name;
unsigned int _age;
} p1("john", 28), p2("Arthur", 26), p3("Caoline", 31);
class Car
{
public:
Car(char* m, unsigned int y): _model(m), _year(y){}
char* model(){cout << "Its a " << _model << endl; return _model;}
unsigned int year(){cout << "Im" << _year << " years old." << endl; return _year;}
private:
char* _model;
unsigned int _year;
} c1("Chrysler C-300", 1955), c2("Chrysler VH Charger", 1971), c3("Ford Fairlane", 1960);
//--------------------------------------------------//
class List
{
public:
List(): length(0){}
// common interface so Lists of Lists can be created
// can´t specify a return type so it returns void*
// BUT need to override it in descendants. WHY IT DOESN´T WORK?
virtual void* get(unsigned int i) = 0;
protected:
unsigned int length;
};
//--------------------------------------------------//
template <class C, unsigned int maxsize>
class Dataset: public List
{
public:
Dataset()
{
// initialize pointers to null
for(int i = 0; i < maxsize; i++){
data[i] = 0;
}
};
// C* return type is ignored
C* get(unsigned int i)
{return data[i];};
int set(C* dataIn)
{
data[length] = dataIn;
return length++;
};
protected:
C* data[maxsize];
};
template <unsigned int maxsize>
class Dataset <List, maxsize>: public List
{
public:
Dataset()
{
// initialize pointers to null
for(int i = 0; i < maxsize; i++){
data[i] = 0;
}
};
List* get(unsigned int i)
{return data[i];};
int set(List* dataIn)
{
data[length] = dataIn;
return length++;
};
protected:
List* data[maxsize];
};
//--------------------------------------------------//
int main()
{
Dataset <Person, 3> columnPerson;
// populate person list
columnPerson.set(&p1);
columnPerson.set(&p2);
columnPerson.set(&p3);
Dataset <Car, 3> columnCar;
// populate car list
columnCar.set(&c1);
columnCar.set(&c2);
columnCar.set(&c3);
Dataset <List, 10> relations; // create a list of lists
// populate it
relations.set(&columnPerson);
relations.set(&columnCar);
// getting a void* and casting it
Person* ptrPerson = (Person*) relations.get(0)->get(0);
ptrPerson->name();
int i;
cin >> i;
};