Wie Vektor in verschachtelten Structs einen Wert zuweisen?



  • Hallo zusammen.
    Nach eingehender Suche im Internt und in diesem Forum bin ich doch nicht richtig fündig geworden, was meine Frage betrifft. Ich hoffe deshalb hier auf Antwort.

    Ich verwende für ein kleines Projekt mehrere verschachtelte Strukturen, die u. a. auch Vektoren enthalten (die ihrerseits auf Strukturen verweisen), also z. B.:

    struct koords {
        int x;
        int y;
    };
    
    struct variablen {
        int type;
        vector <koords> elements;
    };
    
    variablen spieler[4];
    

    Wenn ich nun ein Element zu "elements" hinzufügen möchte, benötige ich den Befehl "push_back()". Das Problem hierbei ist, dass ich nicht weiß, wie ich diesen Befehl anwenden muss.

    Bei einem simplen Integer-Vektor wäre die Sache klar:

    vector <int> var0;
    var0.push_back(20);
    

    ... um var0 ein Element mit dem dem Wert 20 hinzuzufügen.

    Also habe ich es folgender Maßen versucht:

    spieler[0].elements.x.push_back(20);
    

    ... um zunächst den X-Wert zu initialisieren. Doch vom Compiler kommt die Fehlermeldung: "'x' is not a member of 'vector<koords,allocator<koords> >' in function main()"

    Wie muss ich mit dem push_back-Befehl arbeit, damit ich "elements" die X- u. Y-Werte zuweisen kann? Oder geht das nicht so einfach?

    Beste Grüße



  • koords k = { 100, 250 };
    	spieler[0].elements.push_back(k); // Eine initialisierte Instanz übergeben.
    
    	spieler[0].elements.push_back(koords()); // Eine default-konstruierte Instanz übergeben...
    	spieler[0].elements[1].x = 1; // ... dessen Datenelemente noch zu setzen sind.
    


  • am einfachsten ist es, wenn du dir konstruktoren erstellst:

    #include <vector>
    
    struct koords {
        int x;
        int y;
    };
    
    struct variablen {
    	variablen(int type, std::vector<koords> elements) : type(type), elements(elements)
    	{}
    	variablen()
    	{}
        int type;
        std::vector <koords> elements;
    };
    
    int main()
    {
    	std::vector<variablen> spieler;
    	koords k[] = {{0,0},{1,1},{2,2}};
    	for (int i = 0; i < 4; ++i)
    	{
    		spieler.push_back(variablen(i, std::vector<koords>(k, k+3))); //statt i einfach irgend ein anderen wert für typ und für koords wahrscheinlich auch 
    	}
    }
    


  • Dank ersteinmal an euch beide!

    Gugelmoser schrieb:

    koords k = { 100, 250 };
        spieler[0].elements.push_back(k); // Eine initialisierte Instanz übergeben.
    	
        spieler[0].elements.push_back(koords()); // Eine default-konstruierte Instanz übergeben...
        spieler[0].elements[1].x = 1; // ... dessen Datenelemente noch zu setzen sind.
    

    Sind die beiden Varianten equivalent? Die erste Variante funktioniert bei mir nicht, die 2. schon. Allerdings scheint mir die Variante von vario-500 die bessere zu sein.

    vario-500 schrieb:

    am einfachsten ist es, wenn du dir konstruktoren erstellst:

    struct variablen {
        variablen(int type, std::vector<koords> elements) : type(type), elements(elements)
        {}
        variablen()
        {}
        int type;
        std::vector <koords> elements;
    };
    

    Warum benötige ich hier nicht auch einen Destruktor?
    Wofür benötige ich den Ausdruck "variablen() {}" (mit leeren runden Klammern)?
    Ich bekomme 3 Warnungen, eine bezieht sich auf den Quelltext und zwei auf die "vector.h". Die folgende Warnung bezieht sich auf den Quelltext:

    Warning W8026 C:\Test\test.cpp 12: Functions taking class-by-value argument(s) are not expanded inline in function variablen::variablen(int,vector<koords,allocator<koords> >)

    Die beiden "Vektor-Warnungen" lauten wie folgt:

    Warning W8008 C:\Program Files (x86)\cmdlt\Include\vector.h 213: Condition is always false in function __init_aux<koords *>(koords *,koords *,_RW_is_not_integer)
    Warning W8066 C:\Program Files (x86)\cmdlt\Include\vector.h 214: Unreachable code in function __init_aux<koords *>(koords *,koords *,_RW_is_not_integer)

    Weiß jemand, warum ich die Warnungen erhalte, wenn ich den Quelltext aus dem oberen Post zu komilieren versuche?



  • codecrack schrieb:

    Sind die beiden Varianten equivalent?

    Nein sind sie nicht. Es gibt nur, wie überall, viele Wege die nach Rom führen.

    codecrack schrieb:

    Die erste Variante funktioniert bei mir nicht, die 2. schon.

    Funktioniert nicht bedeutet? Hast du mir deine Fehlermeldung?

    codecrack schrieb:

    Warum benötige ich hier nicht auch einen Destruktor?

    Du benötigst keinen selbst implementierten Destructor, weil du auch keinen selbst implementierten Copy-Constructor und Zuweisungsoperator brauchst. Die Regel lautet, sobald du einen dieser drei selbst implementierst, solltest du auch unbedingt die anderen beiden implementieren. Wenn du sie nicht selbst implementierst, erzeugt der Compiler sie für dich und er macht seine Aufgabe stets gut.

    codecrack schrieb:

    Wofür benötige ich den Ausdruck "variablen() {}" (mit leeren runden Klammern)?

    Das ist ein Default-Constructor. Den benötigst du aber nicht, darum lass ihn weg.

    codecrack schrieb:

    Weiß jemand, warum ich die Warnungen erhalte, wenn ich den Quelltext aus dem oberen Post zu komilieren versuche?

    Also ich bekomme keinerlei Warnungen. Was für einen Compiler benutzt du mit welchen Warning-Optionen?



  • codecrack schrieb:

    Die erste Variante funktioniert bei mir nicht, die 2. schon.

    Das ist etwas unkonkret. Entschuldigt. Die Fehlermeldung dazu lautet, wie folgt:

    Error E2188 C:\Test\test.cpp 482: Expression syntax in function main()

    Der Fehler tritt in der Zeile von "koords k = { 100, 250 };" auf. Es kann aber am Kontext liegen, da ich den Code in mein eigentliches Programm eingebaut habe, das etwas anders aussieht. Für 100 und 250 habe ich Variablen, die vorher mit einem Zufallswert belegt werden.

    Vielen Dank für deine Erklärungen, Gugelmoser. Ich verstehe sie zwar nicht, aber das liegt wohl daran, dass ich mich zuwenig mit Klassen beschäftige, was ich nachholen werde.

    Als Compiler verwende ich den Borland C++ 5.5.1 für Win32 aus den "Command Line Tools" von Borland mit den Standardeinstellungen. Aber es ist vielleicht eine gute Idee, einfach einmal einen anderen Compiler zu verwenden. Das werde ich einmal probieren.

    Bis dann.

    Update:
    Der Dev-C++ Compiler gibt mir 2 Fehler in derselben Zeile (482) aus: "'{' fehlt" und "';' erwartet vor '{'", was ich überhaupt nicht verstehe, da ich an Semikolons oder Klammern nichts verändert habe. 😕

    482 C:\Test\test.cpp expected primary-expression before '{' token
    482 C:\Test\test.cpp expected `;' before '{' token

    Ich wiederhole: Eine Variante funktioniert und zwar ohne, dass ich etwas an den Semikolons oder Klammern verändere.

    Update 2:
    Ich habe den Fehler gefunden. Ich hatte nicht "koords k = { 100, 250 };" geschrieben, sondern nur "k = { 100, 250 };" und koords k hatte ich vorher separat deklariert (was meiner Meinung nach auch hätte funktionieren müssen, aber egal).


Anmelden zum Antworten