У меня проблемы со следующей ситуацией. У меня есть три класса, которые участвуют в этом смешении. List
, ListNode
, City
. У меня есть List<City *>
, где список будет состоять из набора ListNode<City *>
(стандартная оболочка вокруг узлов списка).
City является абстрактным классом, поэтому есть несколько классов, которые наследуют его, которые можно поместить в этот список и получить полиморфный доступ. Класс List имеет метод getHead()
, который возвращает указатель на ListNode
, который является головой. * * 1010
В любом городе есть население, поэтому, чтобы получить доступ к населению, я ожидал, что сработает следующее. Это не так, таким образом, мой вопрос. Я разбил его на части, чтобы было проще:
ListNode<City *> *head= country->city_list->getHead();
City *headnode = *head->getNode();
cout << "Test: " << headnode->getPopulation() << endl;
getPopulation()
возвращает целое число. country
определяется как List<City*> *city;
Любая помощь в выяснении моей проблемы будет принята с благодарностью.
edit добавление дополнительного кода для лучшего понимания того, с чем я работаю. Во-первых, ListNode:
template <class T>
class ListNode
{
public:
ListNode() {next = 0;node = 0;};
ListNode(T *t) {node = t; next = 0;};
ListNode(const ListNode &l)
{
//long copy constructor. snip.
};
T *getNode() const { return node; }
ListNode *getNext() const { return next; };
private:
T *node;
ListNode *next;
};
Теперь вот что может иметь значение в классе List.
template <class T>
class List
{
public:
List()
{
head = 0;
size = 0;
};
List(ListNode<T> *t)
{
head = t;
size = 1;
};
List(T *t)
{
head = new ListNode<T>(t);
size = 1;
};
List(const List<T> &t)
{
// long copy constructor. snip.
};
//bunch of irrelevent methods.
ListNode<T> *getHead() const {return head;};
List &operator+=(T &t)
{
this->insert(&t);
size++;
return (*this);
};
private:
List &insert(T *t)
{
ListNode<T> *current = head;
if (current == 0)
{
head = new ListNode<T>(t);
}
else
{
while (current->getNext() != 0)
{
current = current->getNext();
}
current->setNext(new ListNode<T>(t));
}
return (*this);
};
ListNode<T> *head;
int size;
};
У меня есть догадка, что процесс вставки может быть проблемой. Я вставляю с помощью оператора + = класса List, показанного в реализации List выше. Он также вызывает приватный метод вставки, показанный выше. Это выглядит так:
Город * somecity = новый город (x, y, z); // некоторые параметры. целые числа.
* city_list + = somecity; // где city_list является списком.