2016-08-03 23 views
-1

Bevor ich meine Frage stelle, möchte ich im Voraus erwähnen, dass mir bewusst ist, dass dieses Thema viel diskutiert wurde, aber noch einmal, indem ich auf die meisten Antworten schaute, habe ich nicht den richtigen Weg gefunden erreichen, was ich will (wahrscheinlich weil ich etw von den Antworten vermisst habe). Also sage ich, dass ich 20 Mal einen Vektor von Objekten (sagen wir mal von jeder Größe) erstellen möchte, der von globalem Umfang sein sollte (in dem Sinne, dass dies innerhalb einer Klasse gemacht wird und ich möchte, dass diese Vektoren von Objekten außerhalb der Klasse). Also, ich bin wirklich nicht sicher, ob das folgende gilt:Initialisierung des Vektors der Objekte

for (int i =0; i<20; i++) 
vector<A> * vec_of_class = new vector<A>(10); 
/*where A is the class and I use new to have them in the heap, 
so that they won't be local */ 

Nun, ich weiß, dass dies bedeutet, dass ich besonders vorsichtig sein sollte, sie und vergewissern Sie sich mit der Handhabung, dass ich sie preper löschen, aber ich bin nicht sicher, ob die Operation, die ich mache, gültig ist. Im Allgemeinen möchte ich erreichen, 20 verschiedene Vektoren von Objekt A zu initialisieren, die im globalen Bereich verwendet werden können (die Operation findet innerhalb einer Funktion einer anderen Klasse statt), ich weiß, dass es ein Vektor von Vektoren des Objekts verwendet werden könnte A, aber ich würde gerne herausfinden, wie man diese Art von Operation korrekt durchführt (20 verschiedene Vektoren von Objekt A in der Körperfunktion einer anderen Klasse initialisieren und global verwenden). Ich hoffe, meine Frage war nicht zu verwirrend und Sie könnten mir hier helfen.

+0

Ok, das ist was ich auch dachte, aber wie kann ich dann die Operation richtig machen? – user3111197

+1

Warum nicht einfach "Vektor > vec_of_class (20, Vektor (10));'? – DimChtz

+0

Ich vermute, dass Sie ein Klassenmitglied wie folgt haben wollen: 'std :: vector > Mitglied {20, std :: vector (10)};'. Et voila, 20 Vektoren mit je 10 Elementen. –

Antwort

4

Es sollte nie ein Fall geben, wenn Sie einen Standardcontainer, einschließlich Vektor, dynamisch zuweisen. So ist std::vector<> = new <> immer falsch.

Um Ihren Vektor zu initialisieren, können Sie eine Vielzahl von Techniken verwenden. Ich finde initializer Listen besonders praktisch, wie hier:

std::vector<int> vec{10, 20, 30, 40, 50}; 
+0

Ist es nicht Vektor vec = {10,20,30,40,50}; ? –

+0

@OmidCompSCI Beide sind gültig – DimChtz

+0

@OmidCompSCI Google _uniform Initialisierung_. –

0

Also, sage ich 20-mal einen Vektor von Objekten erstellt werden soll (zum Beispiel der Größe zehn jeden)

das einfach. Verwendung:

std::vector<std::vector<A>> my_data{20, std::vector<A>{10}}; 

, die von globaler Reichweite sein sollte (in dem Sinne, dass dies in einer Klasse getan, und ich will diese Vektoren von Objekten außerhalb der Klasse übergeben werden).

Ich habe kein klares Bild von dem, was Sie hier erreichen möchten.

Wenn innerhalb einer Klasse etwas getan wird, könnte dies in einer static Elementfunktion oder einer regulären Elementfunktion erfolgen. Es scheint, als ob Sie eine static Mitgliedsfunktion verwenden sollten, aber ich bin mir nicht sicher.

Wenn Sie eine static Member-Funktion verwenden, würde ich vorschlagen:

std::vector<std::vector<A>> const& TheClass::get_my_data() 
{ 
    static std::vector<std::vector<A>> my_data{20, std::vector<A>{10}}; 
    static bool inited = false; 
    if (!inited) 
    { 
     // Set the values of the elements in my_data 
     // ... 

     inited = true; 
    } 
    return my_data; 
} 

Wenn Sie eine reguläre Mitglied-Funktion verwenden, schlage ich my_data im Konstruktor bevölkerte und aus einer Funktion zurückkehrt.

// Need to make my_data a member variable 
TheClass::TheClass() : my_data{20, std::vector<A>{10}} 
{ 
    // Set the values of the elements in my_data 
    // ... 
} 

std::vector<std::vector<A>> const& TheClass::get_my_data() const 
{ 
    return my_data; 
}