Lista na szablonach - no default constructor?

0

Witam,

Napisałem sobie szablon klasy List, która ma odpowiadać za tworzenie listy pojedynczo łączonej zawierającej w zależności od potrzeby różne obiekty. Jej kod wygląda tak:

template <typename T>
class List {

	private:
		struct Node {
			T data;
			Node* next;
		};
		Node* head;

	public:
		List() {
			this->head = NULL;
		};
		~List() {
			// Deleting all elements
		};
		void add(const T& p);
		void print();

};

template <typename T>
void List<T>::add(const T& p) {

	Node* tmp = this->head;
	Node* newNode = new Node();

	newNode->data = p;

	if (!tmp) {				
		newNode->next = NULL;
	}
	else { 
		newNode->next = this->head;
	};

	this->head = newNode;

};

Za każdym razem jednak pojawia się błąd mówiący o tym, że brak jest domyślnego konstruktora dla struktury Node. Do czego jest on potrzebny i jak mogę go mądrze zaimplementować?

0

Przedstawiony przez ciebie kod skompiluje się bez problemu, ponieważ struktura w C++ jest w istocie klasą z wszystkimi polami publicznymi. Zatem posiada pusty konstruktor bezparametrowy wygenerowany przez kompilator i new Node() wywoła ten konstruktor. Pokaż lepiej CAŁY kod.

0

Ok, opiszę konkretnie mój przypadek. Posiadam sobie klasę Klient i przy każdym kliencie chciałem mieć listę polis ubezpieczeniowych, które on posiada. Robię to tak:

class Customer {

	private:
		// Pola prywatne
		(List<Policy>)* policies;
        public:
		Customer(string n, string s, string p) {

			this->policies = new List<Policy>;

                        // Konstruktor - część dalsza
                };
};

W mainie tworzę sobię obiekt klienta, później obiekt polisy i przekazuję cały obiekt do funkcji add w obiekcie klasy List (this->policies). I tam pojawia się błąd o braku domyślnego konstruktora...

0

Node* newNode = new Node();
Tutaj konstruuje się nowy Node. Jednak z racji że ten typ posiada pole klasowe, to ono musi być zainicjalizowane.
Precyzujesz że typem jest Twój customer, a więc do utworzenia node'a w obecnym stanie rzeczy ta klasa musi posiadać konstruktor bezparametrowy. A ten przestaje być tworzony przez kompilator gdy tylko określisz jakikolwiek konstruktor własnoręcznie.

0

Tak jak napisał ktoś w komentarzu - w swojej liście przechowuje obiekty typu Policy, a nie Customer, ale to nie ma znaczenia. Jak w takim razie mam rozwiązać ten problem? Powinienem napisać bezparametrowy konstruktor do Node, który uruchomi konstruktor klasy Policy?

0

Klasa Node posiada już bezparametrowy konstruktor, gdyż jest on tworzony automatycznie przez kompilator. Wyobraź sobie, że wspomniany konstruktor Node'a wygląda tak:

Node()
{
data = T();
}

Potrzebujesz bezparametrowego konstruktora do policy, no chyba że inaczej zainicjalizujesz pole Node'a, np. konstruktorem kopiującym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1