Wie initialisiere ich einen stl-Vektor von Objekten, die selbst nicht-triviale Konstruktoren haben?
angenommen ich habe folgende Klasse:
class MyInteger {
private:
int n_;
public:
MyInteger(int n) : n_(n) {};
//MORE STUFF
};
Außerdem wird angenommen, dass diese Klasse nicht über eine Standard-trivialen Konstruktor MyInteger()
. Ich muss immer Angebot ein int
die Initialisierung aus irgendeinem Grund. Und dann angenommen, dass irgendwo in meinem code brauche ich eine vector<MyInteger>
. Wie kann ich die initialisieren jedes MyInteger
Komponente in diesem vector<>
?
Habe ich zwei Situationen (wahrscheinlich die Lösung ist die gleiche, aber ich werde Stand Ihnen sowieso), eine normale variable innerhalb einer Funktion:
int main(){
vector<MyInteger> foo(10); //how do I initialize each
//MyInteger field of this vector?
doStuff(foo);
}
und als Daten in einer Klasse:
class MyFunClass {
private:
vector<MyInteger> myVector;
public:
MyFunClass(int size, int myIntegerValue) : myVector(size) {};
//what do I put here if I need the
//initialization to call MyInteger(myIntegerValue) for all
//components of myVector?
};
Ist es möglich, es zu tun, nur in der Initialisierungs-Liste oder muss ich schreiben die Initialisierung von hand in die MyFunClass(int, int) - Konstruktor?
Scheint sehr einfach, und doch habe ich irgendwie verpasst inmy book und kann Sie nicht finden im web.
InformationsquelleAutor der Frage Rafael S. Calsaverini | 2011-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt viele Möglichkeiten, um dorthin zu gelangen. Hier sind einige von Ihnen (in keiner bestimmten Reihenfolge der Gegenwart).
Verwenden
vector(size_type n, const T& t)
Konstruktor. Es initialisiert Vektor mitn
Kopient
. Zum Beispiel:Push-Elemente in Vektor. Dies kann nützlich sein, wenn die Werte unterschiedlich sein sollten. Zum Beispiel:
Andere option Konstruktor-Initialisierung-Liste, wenn die C++0x ist eine option:
Natürlich, es gibt eine option, um Standard-Konstruktor und/oder etwas anderes als
std::vector
.Hoffe, es hilft.
InformationsquelleAutor der Antwort
Wenn die Elemente des Vektors sind nicht Standard-baubar, dann gibt es bestimmte Dinge, die Sie nicht mit den vector. Sie können nicht schreiben (Beispiel 1):
Können Sie jedoch schreiben (Beispiel 2):
(Dies erfordert lediglich eine Kopie-Konstruktor.) Das zweite argument ist eine Initialisierung für die Elemente des Vektors.
In Ihrem Fall könnten Sie auch schreiben:
...da MyInteger hat einen nicht-explicit-Konstruktor "int" als argument. So wird der compiler cast 37 MyInteger(37) und das gleiche Ergebnis wie in Beispiel 2.
Möchten Sie vielleicht, um zu studieren die Dokumentation zu std::vector.
InformationsquelleAutor der Antwort Nemo
InformationsquelleAutor der Antwort mbykov
Neben all den Antworten, die die Frage beantwortet sehr gut, in einem Fall, dass die Klasse MyInteger ist nicht kopieren-bebaubar wird, könnten Sie diesen trick : anstatt
vector< MyInteger>
könnten Sievector< shared_ptr< MyInteger > >
InformationsquelleAutor der Antwort BЈовић