10 Stimmen

C++ Verwendung von Zeigern auf Vorlagenobjekte

Ich habe eine Klasse namens ABC, die eine Klassenvorlage hat:

template <class T> class ABC{}

In einer anderen Klasse versuche ich, die Objekte ABC in einer Liste zu speichern:

class CDE{
private:
  list<ABC *> some_list; 
}

Ich beabsichtige, Objekte der Klasse ABC zu speichern, die unterschiedliche Klassenvorlagenparameter haben können. Ist es notwendig, die Vorlage auch für einen Zeiger zur Kompilierzeit anzugeben? Was ist, wenn der Container Objekte von unterschiedlichem Typ speichern soll? Ist das nicht möglich?

10voto

Tim Punkte 8672

Ist es notwendig, eine Vorlage auch für einen Zeiger zur Kompilierungszeit anzugeben?

Ja.

Was ist, wenn der Container Objekte unterschiedlichen Typs speichern soll? Ist das nicht möglich?

Das ist nicht (direkt) möglich.

So etwas wie die Klasse ABC gibt es nicht. Es gibt nur Instanziierungen von ABC, wie z. B. ABC<Foo> y ABC<Bar> . Es handelt sich um völlig unterschiedliche Klassen.

Sie können etwas tun wie:

template<typename T>
class ABC : public ABC_Base
{
  ...
}

list<ABC_Base*> some_list;

Auf diese Weise haben alle Ihre ABC-Instanziierungen einen gemeinsamen Basistyp, und Sie können einen Basiszeiger beliebig verwenden.

1voto

user470379 Punkte 4809

Sie müssen entweder die Parameter der Vorlage in Ihrem CDE Klasse, oder machen Sie CDE auch eine Vorlage.

Erste Option:

class CDE {
private:
    list< ABC<int>* > some_list;
};

Zweite Möglichkeit:

template <class T>
class CDE {
private:
    list< ABC<T>* > some_list;
};

1voto

Alex Deem Punkte 4607

Die Liste kann nur einen einzigen Typ speichern. Verschiedene Instanziierungen einer Vorlage sind verschiedene Typen. Wenn dies zufriedenstellend ist, können Sie es so machen:

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

Wenn Sie verschiedene Typen verwenden müssen, können Sie vielleicht eine Nicht-Template-Basisklasse für ABC erstellen und Zeiger auf diese Klasse speichern. (d. h. eine Schnittstelle verwenden)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X