Betrachten wir die folgenden KlassenWas ist das bevorzugte C++ - Idiom, um eine Sammlung von polymorphen Objekten zu besitzen?
class Base {
public:
virtual void do_stuff() = 0;
};
class Derived : public Base {
public
virtual void do_stuff() { std::cout << "I'm useful"; };
};
die wir nun sagen, dass ich eine andere Klasse verantwortlich für den Besitz von Objekten Base
‚s abgeleiteten Typen haben wollen und durchlaufen sie ihre do_stuff()
Methode aufrufen. Es sieht so aus, aber ich weiß nicht, was T
als
class Owner {
public:
void do_all_stuff() {
//iterate through all items and call do_stuff() on them
}
void add_item(T item) {
items.push_back(item);
}
vector<T> items;
}
ich ein paar Möglichkeiten sehe erklärt werden soll:
T
nicht Base
sein, da ich nur Objekte hinzuzufügen wäre in der Lage von Betontyp Base
, so das ist nicht in Frage.
T
kann Base*
oder Base&
, aber jetzt muss ich den Anrufer von add_item()
vertrauen mir einen Zeiger oder einen Verweis auf ein Objekt zu übergeben, die noch existieren wird, wenn ich es aus items
abzurufen. Ich kann nicht delete
die Elemente in Owner
destructor, da ich nicht weiß, dass sie dynamisch zugewiesen wurden. Jedoch sollten sie delete
sein, wenn sie es waren, was mich mit zweideutigem Besitz zurücklässt.
T
kann Base*
oder Base&
und ich fügen Sie ein Base* create_item<DerivedT>() { return new DerivedT; }
Methode Owner
sein. Auf diese Weise weiß ich, dass der Zeiger gültig bleibt und ich ihn besitze, aber ich kann keinen Nichtstandardkonstruktor unter DerivedT
aufrufen. Außerdem wird Owner
für das Instanziieren von Objekten verantwortlich. Ich muss auch jedes Element in Owner
Destruktor löschen, obwohl das kein großes Problem ist.
Grundsätzlich würde Ich mag Lage sein, etwas Ähnliches zu tun:
Owner owner;
void add_one() {
Derived d;
owner.add_item(d);
}
void ready() {
owner.do_all_stuff();
}
void main() {
for(int i = 0; i < 10; ++i) {
add_one();
}
ready();
}
Ich bin sicher, es ist etwas im Zusammenhang Semantik dort zu bewegen (ich die Objekte add_items()
weitergegeben bewegen konnte, sie zu besitzen) aber ich kann immer noch nicht herausfinden, wie meine Sammlung erklärt werden würde.
Was ist das C++ - Idiom für diese Art von polymorphem Eigentum (insbesondere bei STL-Containern)?
Wenn Sie Polymorphie wollen, werden Sie am Ende tun 'std :: container ', "mehrdeutig" oder nicht. Wenn Sie sich Sorgen um die Speicherverwaltung machen, können Sie auch einen 'Container >' erstellen. –
Sie haben keine große Auswahl. Sie können eine Sammlung von (a) rohen Zeigern (b) intelligenten Zeigern haben. Das ist alles. Theoretisch kann (a) weiter unterteilt werden in (a.1) rohe Zeiger auf Objekte, die dem Container gehören, und (a.2) rohe Zeiger auf Objekte, die nicht dem Container gehören. Sie müssen nur eine Münze werfen und entscheiden. Wenn es auf beiden Seiten zur Ruhe kommt, benutze (b). Wenn es zur Ruhe kommt, auf der Kante stehend, benutze (a.1). Wenn es in der Luft schwebt, benutze (a.2). Einfach, nicht? –
@ n.m. LOL ...... –