Zdravím, poprosil bych o menší radu.
Mám napsanou třídu pro seznam, kde mám metodu na vložení prvku do seznamu:
template <class T> void List1<T>::insert(const T value)
{
item *newItem = new item;
newItem->value = value;
newItem->next = head;
head = newItem;
}
Vše je v pořádku, když jsou do seznamu vkládány primitivní datové typy či objektové typy bez parametrického konstruktoru. Teď se dostávám k tomu, kde je problém. Do seznamu chci jako položku vkládat zásobník, který má v konstruktoru dva parametry - velikost (je realizován polem) a index, respektive pořadí, ve kterém zásobník vzniknul. Provedu tedy instanci třídy:
Stack1<int> s(size, index);
Vytvářím tedy zásobník datového typu int o velikosti size s indexem index.
Nyní provedu operaci přidání do seznamu:
l.insert(s);
Výsledkem je chyba kompilace:
Error 1 error C2512: 'List1<T>::item' : no appropriate default constructor available
Řešením by bylo vytvořit bezparametrický konstruktor zásobníku a inicializaci řešit pomocí metody, avšak k tomuto řešení se mi moc nechce přejít - takhle v konstruktoru mám jistotu, že inicializace proběhne vždy, kdybych to řešil bezparametrickým konstruktorem, tak bych musel i řešit stav, kdy by docházelo k práci s neinicializovaným zásobníkem. Navíc jsem to kdysi zkoušel pomocí metody a docházelo k problémům s uvolněním paměti v destruktoru (uvolnění vícekrát stejného bloku, dle hlášky VS).
Existuje tedy řešení, jak zachovat parametrický konstruktor a tento objekt předávat do metody? Vždy jsem si myslel, že problémy parametrických konstruktorů jsou u polí, zde by mě možný problém nenapadl, inu, člověk se pořád učí.
Díky za rady a přeji hezký večer.