C++ : Vektor-template-Klasse
Ich habe eine template-Klasse namens " Zelle wie folgt:-
template<class T>class Cell
{
string header, T data;
}
Nun möchte ich eine weitere Klasse mit dem Namen Zeile. Zeile wird ein Vektor namens Zellen, so dass ich hinzufügen kann, sowohl Zell-und Zell-Typ Elemente, die vector. Ist es möglich?
Wenn ja, wie kann ich das machen?
Vielen Dank im Voraus.
- Wollen Sie eine Zeile zu halten, zum Beispiel, eine Zelle<int> Zelle<float> und jede andere Zelle Typ in der einen Vektor<>?
- Ja, du hast Recht. Ich genau das will.
- ist, die meinen, Sie wollen polymorphe container? Sie können nur dynamische Polymorphie (Vererbung) und nicht statisch polymorpism (Vorlagen).
- Würden Sie bitte geben Sie mir einige Beispiel-codes für das?
- "Ich habe eine template-Klasse namens "Cell" Nein, du nicht. Das ist ein - Klasse template, was bedeutet, es ist nicht eine Klasse.
Cell<int>
ist eine Klasse.Cell<float>
ist eine Klasse, wie gut, wie istCell<Cell<std::vector<double>>>
. Aber es sind drei verschiedene, unabhängige Klassen, die nichts gemeinsam haben. - Skizz zur Verfügung gestellt, was genau ich bin reden über.
- Alle Elemente der Vektor muss vom gleichen Typ sein, also Sie können eine
Cell<float>
und einCell<int>
zusammen. Sie benötigen Pointer und Vererbung, und Sie müssen wissen, was Sie tun. Es ist all zu leicht zu erstellen einen nicht verwendbaren Basis-Klasse mit dem Fleisch in die Kinder, und dann haben Sie keine Möglichkeiten, darauf zuzugreifen. Sie brauchen, um Fleisch in der base-Klasse. Das heißt, es muss eine nutzbare Schnittstelle, die nicht davon abhängen, T.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit den zusätzlichen Details, die Sie haben, die ersten beiden Antworten, die nicht funktionieren. Was Sie benötigen, ist ein Typ, bekannt als eine Variante für die Zelle und dann kann man einen Vektor von denen. Zum Beispiel:-
Dies ist jedoch ein Schmerz, um neue Arten zu, wie es erfordert eine Menge code zu pflegen. Eine alternative könnte die Verwendung der cell-Vorlage mit einer gemeinsamen Basis-Klasse: -
Könnte dies besser funktionieren, als Sie weniger code zunächst ein update auf fügen Sie eine neue Zelle geben, aber Sie müssen verwenden Sie einen Zeiger-Typ, der in den Zellen Vektor. Wenn Sie gespeichert werden, ist die Zelle Wert,
vector <ICell>
, dann werden Sie Daten verlieren aufgrund object slicing.Der Grund, warum ist dies NICHT möglich, in C++, aber möglich in Java/Python ist da: in einem C++ - Vektor, der von der STL-container Speicher (zurückgegeben von vector::data()) enthält alle Objekt-Instanziierungen sequencially verpackt. In denen jedes element muss die gleiche Größe. Dies macht die Adressierung schnell und bequem. Also, angenommen, Sie definieren eine Vorlage-Klasse A,
Seine Größe hängt von der template-Variablen "T obj". Drücken der gleichen Klasse Eine von verschiedenen template-Typ T wird jedes element in dem Vektor, in unterschiedlichen Größen, so ist dies unmöglich. Der einzige Weg, um den Vektor von shared_ptr oder unique_ptr, der eine Basis-Klasse. Beide shared_ptr und unique_ptr unterstützt C++11 und Boost. Jeder abgeleiteten Klasse ein element können unterschiedliche template-Typen. Auf diese Weise, wenn die Basisklasse Zeiger der Destruktor aufgerufen wird, muss die abgeleitete Klasse den Destruktor wird aufgerufen. Zum Beispiel,
Erinnern zu kompilieren mit -std=c++11 aktivieren der C++11.
Ausgabe:
Und Sie bekommen, was Sie wollen! 🙂
In Java/Python, jede Klasse-Objekt-variable eigentlich ein Zeiger, also ein Java-Array von Einem oder einer Python-Liste von A ist äquivalent zu einem C++ - array von Zeigern von A. So erhalten Sie im wesentlichen die gleiche Funktionalität ohne die explizite Erstellung von shared_ptrs.
cpp:25:13: error: 'shared_ptr' was not declared in this scope
Die andere Antwort ist gut, aber Sie wollten wahrscheinlich:
Sowas?
Okay, diese Antwort ist falsch.
Also, wenn Sie speichern möchten, in einem
vector
verschiedenen Zellen - sollten Sie einige dynamische Typ-Bezeichnung (Sie können eine Basis-Klasse und Zeiger darauf speichern in vector, die nur virtuelle Funktionen, die overrided in allen abgeleiteten Klassen, die Sie speichern können, so etwas wieboost::any
und sparentype-identification
für jedes eingefügte element, für warfen Sie in real geben und mit ihm arbeiten).>
um Verwechslungen zu vermeiden, mit>>
Betreiber. C++11 nicht, müssen dies aber nicht.vector
ist ein array, so sollte es die gleiche statische Typ für alle Elemente in es, aber Zelle<int> und Zelle<char> sind nicht-Verwandte Typen (im Gegensatz zu generischen Klassen in jave).