PDA

Visualizza la versione completa : [C++] Implementazione di classi annidate


L'Aquila
15-02-2011, 20:26
Buonasera,
sto cercando di utilizzare delle classi annidate per creare un iteratore associato ad una classe myvector.
Il file myVector.h contiene il codice:


template <typename T>
class myVector
{
public:
/* Costruttore */
myVector();

class Iterator;
friend class Iterator;
class Iterator {
private:
/*...........*/
public:
Iterator(); /* Costruttore */
};

/* Restituisce un iteratore che punta ad elementi del vettore */
Iterator first(); // Al primo elemento
Iterator last(); // All'ultimo elemento

};


nel file .cpp il codice associato alle funzioni first e last :



template <typename T> myVector<T>::Iterator myVector<T>::first()
{
Iterator myIter;
myIter.position = head;
return myIter;
}

template <typename T> myVector<T>::Iterator myVector<T>::last()
{
Iterator myIter;
myIter.position = tail;
return myIter;
}


ma mi restituisce l'errore

expected constructor, destructor, or type conversion before "myVector"

non riesco a capire dov' che sbaglio.... :bh:

lolide
15-02-2011, 21:06
Modifica:



template <typename T> myVector<T>::Iterator myVector<T>::first()
{
Iterator myIter;
myIter.position = head;
return myIter;
}

template <typename T> myVector<T>::Iterator myVector<T>::last()
{
Iterator myIter;
myIter.position = tail;
return myIter;
}


con



template <typename T> typename myVector<T>::Iterator myVector<T>::first()
{
Iterator myIter;
myIter.position = head;
return myIter;
}

template <typename T> typename myVector<T>::Iterator myVector<T>::last()
{
Iterator myIter;
myIter.position = tail;
return myIter;
}

:ciauz:

shodan
15-02-2011, 21:07
nel file .cpp

avrai un errore di linking.
I template devono stare nello stesso header file e le funzioni (se non nel corpo della classe) avere lo specificatore: inline.

L'Aquila
16-02-2011, 18:38
Ho seguito le indicazioni di lolide e sembra che il problema sia risolto (sono riuscito a compilare il codice).

Grazie per l'aiuto.

Perseguendo l'obiettivo mi trovo ora a ridefinire gli operatori esterni + e - con il seguente codice:


template <typename T> typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator it, int n);
template <typename T> typename myVector<T>::Iterator myVector<T>::Iterator::operator-(myVector<T>::Iterator it, int n);


queste righe le ho scritte al di fuori di ogni classe. Il compilatore risponde con

`typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator, int)' must take either zero or one argument
no `typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator, int)' member function declared in class `myVector<T>::Iterator'
declaration of `typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator, int)' outside of class is not definition
template definition of non-template `typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator, int)'
:dh:
mi potete aiutare anche con questo? grazie! :afraid:

shodan
16-02-2011, 18:57
Se l'operatore di tipo binario (cio che prende due argomenti), non pu essere membro della classe. Dev'essere definito fuori e friend.
La cosa pi comoda incorporarlo direttamente nel corpo della classe, evitando contorsionismi dichiarativi.


class myVector<T> {

...
class Iterator {
...
friend Iterator operator+(Iterator it, int n) {
return Iterator(it.dato_da_incrementare + n);
}

}
}

L'Aquila
17-02-2011, 17:51
Grazie mille shodan! Spero di non doverti disturbare pi! :D

Loading