#include <iostream>
using namespace std;
template <typename T> class Iterator
{
T * ptr;
public:
Iterator(T * addr)
{
ptr=NULL;
ptr=addr;
}
//not working
//virtual Iterator * operator ++(int x);
/*Iterator * operator ++(int x)
{
(this->ptr)++;
return this;
}*/
T operator *()
{
return *ptr;
}
};
template<typename T>
class Vector{
T * a;
public:
Vector(size_t n)
{
a=new T[5];
}
T& operator [](int x)
{
return a[x];
}
class iterator: public Iterator<T>
{
public:
iterator(T * addr): Iterator<T>(addr)
{}
/* not working
Iterator<T> * operator ++(int x)
{
Iterator<T>::ptr++;
return this;
}*/
//working now
iterator * operator ++(int x)
{
Iterator<T>::ptr++;
return this;
}
};
iterator begin()
{
iterator ob(&a[0]);
return ob;
}
};
int main()
{
Vector <char> v(5);
for(int i=0;i<5;i++)
v[i]=i+65;
for(int i=0;i<5;i++)
cout<<v[i]<<endl;
/*~~~~~~ What I want~~~~~~
Iterator <char> p=v.begin();
*/
// what is working now:
Vector<char>:: iterator p=v.begin();
while(*p){
cout<<*p<<endl;
p++;
}
return 0;
}
In dem obigen Code, ich möchte Operator machen ++() in Iterator-Klasse, virtuelle, so dass Haupt in die ich verwenden kann:Implementieren von Java-Sammlung Hierarchie in C++
Iterator <char> ptr=v.begin();
anstatt zu Verwendung:
Vector <char>:: iterator p=v.begin();
, die eine einzige Basisklasse refernce mit Laufzeit-Polymorphismus ist, um zu bestimmen, welchen Betreiber auf anrufen ++ je nachdem, ob der Wert ein Vektor oder eine Liste ist. Wenn ich es jedoch in der Iterator-Klasse als virtuell deklariere, funktioniert es nicht. Ich muss es ausschließlich für die inneren Klassen deklarieren, aber ich möchte eine einzige Schnittstelle wie in Java. Ich versuche, die Java-Sammlungshierarchie in C++ für bessere Struktur zu implementieren. Was läuft falsch? Ist es passiert, weil Iterator ist eine Vorlage-Klasse, die Rückgabetyp Iterator auch Vorlage, das heißt, der Operator ++() -Funktion eine Vorlagenfunktion? Ich weiß, Template-Funktionen können nicht virtuell sein, nur konkrete Funktionen können virtuell sein. Was kann getan werden, um dies zu beheben?
Warum wollen Sie Laufzeitpolymorphismus auf Iterator? Was ist die tatsächliche Verwendung? –
In Java haben wir eine einzelne Iterator-Schnittstelle, aber in C++ verwenden wir Vektor :: Iterator und einen anderen für Liste und so weiter. Also wollte ich eine einzelne Iterator-Basisklasse erstellen. Verwenden Sie dann eine Basisklassenreferenz, um verschiedene Iteratorimplementierungen aufzurufen, z. B. hat die Liste eine andere Implementierung als der Vektor. Zur Laufzeit würde es herausfinden, wessen Iteratorimplementierung aufgerufen werden soll, abhängig davon, auf welches Objekt die "Iterator" -Referenz zeigt. –
Sie antworten mir nicht. Ich weiß bereits, dass Sie Laufzeit-Polymorphismus wollen. Was ich gefragt habe, ist warum. Wie im eigentlichen Anwendungsfall. Ich frage mich, wie besonders Ihr Anwendungsfall ist, da der konzeptbasierte Kompilier-Polymorphismus, den wir täglich anwenden, bereits die meisten Fälle abdeckt. –