vector größe in klasse



  • Habe folgendes problem,
    wenn ich einen vector in einer klasse erstelle:

    class Punkt{
            public
              vector<Punkt> vectorName;
    };
    

    Dann kann ich keine größe des vectors festlegen,
    lege ich die größe trotzdem fest dann kann ich innerhalb
    der methoden nicht mehr mit dem . Operator auf die elemente
    im vector zugreifen.
    danke
    joeshrooms



  • Ganz ehrlich, was möchtest Du?

    Geht vielleicht etwas Beispielcode, was denn "nicht geht"?



  • Also es ist doch so:

    Wenn ich einen Vector anlege, nehmen wir hier das beispiel:

    class Punkt{
            public
              vector<Punkt> vectorName;
    };
    

    Dann ist es doch so, dass der Vector: vectorName quasi die Struktur des Klasse Punkt bekommt. Z.b. wenn es eine Variable string Name gibt oder so.

    Jedenfalls kann man ja über den vectornamen (vectorName) mit einem Punkt (vectorName.IRGENDWAS) auf das jeweilige Objekt zugreifen.

    So das ist der Zweck. Ein Vector sieht ja letztendlich wie ein Feld aus, nur das jedes Feld nochmal in unterfelder unterteilt ist, also die Objekte mitdenen man mit dem Punkt zugreifen kann.

    Wenn man einen Vector deklariert kann man ja schon eine größe mitgeben. Mit:

    class Punkt{
            public
              vector<Punkt> vectorName(10);
    };
    

    Ist der Vector von vorneherein 10 Elemente groß. Jetzt kann man z.b. mit vectorName[1].Name; auf das Objekt Name im 2. Element des Vectors zugreifen.

    So... das zur vorgeschichte. Das Problem ist jetzt, dass ich wenn ich das so mache, einen Fehler bekomme. Deklariere ich die größe nicht mit () sondern mit [] dann geht es zwar aber ich kann nicht mehr auf die Elemente zugreifen, denn der Compiler sagt, das z.b. bei vectorName[1].Name, Name kein Element von vectorName ist.

    Jetzt ist die Frage, wie ich halt die größe des Vectors festlege damit ich aber auch auf die Objekte des Vectors zugreifen kann.

    Ich weiß hört sich komisch an... 😃

    Schon mal danke für die Hilfe!!

    MfG

    Nysander



  • Du musst die "Größe", die nichts anderes als ein Konstruktoraufruf ist, in der Konstruktorliste des Punkt-Konstruktors festlegen:

    class Punkt
    {
    public:
        Punkt () : _vec (3)
        {}
    
    private:
        vector<Punkt> _vec;
    };
    

    /edit: @Nysander Du solltest dir mal über die Terminologie im Klaren werden, btw. dich eindeutiger ausdrücken.



  • @ .filmor

    Wo ist denn meine Terminologie denn Unklar?



  • Nysander schrieb:

    Wo ist denn meine Terminologie denn Unklar?

    Nysander schrieb:

    Dann ist es doch so, dass der Vector: vectorName quasi die Struktur des Klasse Punkt bekommt. Z.b. wenn es eine Variable string Name gibt oder so.

    Beweisführung abgeschlossen? 😉



  • LordJaxom schrieb:

    Beweisführung abgeschlossen? 😉

    Naja hat sich schon leicht komisch angehört, aber eigendlich trifft es ja die Eigenschaft genau. Aber egal.

    Vielen Dank für die Hilfe!!



  • Nysander schrieb:

    Wenn ich einen Vector anlege

    Hier wird kein Vector angelegt, hier wird nur deklariert, dass ein Objekt der Klasse "Punkt" eine öffentliche Membervariable des Typs std::vector<Punkt> mit dem Namen "vectorName" enthält. Von Anlegen, also instanziieren kann hier nicht die Rede sein, das war auch scheinbar das Problem.

    Dann ist es doch so, dass der Vector: vectorName quasi die Struktur des Klasse Punkt bekommt

    Nein.

    Z.b. wenn es eine Variable string Name gibt oder so.

    Du meinst Membervariable. Das ist wichtig!

    Jedenfalls kann man ja über den vectornamen (vectorName) mit einem Punkt (vectorName.IRGENDWAS) auf das jeweilige Objekt zugreifen.

    Nein. Lediglich operator[] des Vektors liefert eine Referenz auf ein Objekt der Klasse Punkt zurück. Der normale .-Operator funktioniert nur für Membern von vector.

    So das ist der Zweck. Ein Vector sieht ja letztendlich wie ein Feld aus, nur das jedes Feld nochmal in unterfelder unterteilt ist, also die Objekte mitdenen man mit dem Punkt zugreifen kann.

    Hier verwendest du "Feld" mehrdeutig in unterschiedlichen Zusammenhängen. Der Teil mit den Unterfeldern lässt sich auch einfach als: "Ein Vektor ist ein zusammenhängendes Feld von Objekten" ausdrücken.

    Wenn man einen Vector deklariert kann man ja schon eine größe mitgeben.

    Nein. Das funktioniert nur bei echten Arrays (und da ist es auch nötig). Die Größenangabe (also der Konstruktoraufruf) geht erst bei der Instanziierung (der Objekterstellung).

    class Punkt{
            public
              vector<Punkt> vectorName(10);
    };
    

    Im Zweifel hat der (standardkonforme) Compiler recht. Und das wird er ablehnen.

    Jetzt kann man z.b. mit vectorName[1].Name; auf das Objekt Name im 2. Element des Vectors zugreifen.

    Das ist undeutlich. Statt "Objekt ... im" solltest du "Member ... vom" verwenden.

    Deklariere ich die größe nicht mit () sondern mit [] dann geht es zwar aber ich kann nicht mehr auf die Elemente zugreifen, denn der Compiler sagt, das z.b. bei vectorName[1].Name, Name kein Element von vectorName ist.

    Deklaration mit eckigen Klammern bedeutet, dass du ein Array anlegst (in diesem Fall ein Array von Vektoren von Punkten).



  • Ok, danke für die Aufklärung. Für das nächste mal weiß ich Bescheid.



  • @ .filmor

    Also das mit ändern bzw. anlegen der Größe des Vectors hat ja jetzt funktioniert.

    Jetzt habe ich jedoch das Problem, das wenn ich mein Programm starte geht mein Konsolenfenster sofort wieder zu ohne das was angezeigt wird.

    Muss man da noch etwas beim aufrufen beachten?

    public:
                Artikel() : artikel(10)
                {}
    

    Im Programm:

    int main(void)
    {
     Artikel Artikel1;
    
    system("pause");
    
    }
    

    Danke für die Hilfe!



  • Nysander schrieb:

    Jetzt habe ich jedoch das Problem, das wenn ich mein Programm starte geht mein Konsolenfenster sofort wieder zu ohne das was angezeigt wird.

    int main(void)
    {
     Artikel Artikel1;
    
    system("pause");
    
    }
    

    Danke für die Hilfe!

    Hi,
    was sollte denn da deiner Meinung nach passieren?
    Du erzeugst nen Exemplar von Artikel und das wars...

    Gruss Spacelord



  • Ja das ist mir schon bekannt, aber das Konsolenfenster müsste offen bleiben bis ich eine Taste drücke. Schon allein wegen system("pause") Ich habe es auch versucht, indem ich noch andere dinge, z.b. einen Text ausgeben lasse. Das Konsolenfenster geht immer sofort nach dem Aufrufen zu. Man sieht nichts was ausgegeben wird.

    Dürfte eigendlich nicht passieren.



  • Hallo

    Die system-Funktion dafür zu gebrauchen ist ja auch schlecht. Siehe in die Konsolen-FAQ, das Thema Automatisches Schließen verhindern

    bis bald
    akari



  • Hi,

    also ich habe das mit den vorgeschlagenen alternativen versucht, jedoch auch ohne erfolg. Ich glaube es liegt daran, das ich die größe des Vectors im Konstruktor festsetze.

    Wenn ich dies herauskommentiere geht das fenster nicht zu und sowohl der systemaufruf wie auch die alternativen zur verhinderung des automatischen schließens des konsolenfensters funktioniert.

    Komisch...



  • Mit diesem Konstruktor wird ein Vektor erzeugt, der n Elemente enthält. Kein Wunder, dass das kaputt geht. Ich hatte angenommen, es würde nur Platz für n Elemente reserviert. Ersetz das mal hier durch:

    Punkt ()
    {
        _vec.reserve (n);
    }
    


  • @.filmor

    Hey super!! Das hat funktioniert.

    Ganz ehrlich: Ich währ aufgeschmissen gewesen. Darf ich fragen, woher du solche informationen bekommst. Hast Du, abgesehen von Dir selbst, eine gute Referenz?

    Ich denke das der rest jetzt einfach wird, da dieses Problem mit dem vector elementar für mein Programm war.

    Vielen vielen vielen Dank für Deine Hilfe.

    Wenn nicht schreibe ich wieder 🙂

    Noch mal vielen Dank!



  • Ich glaub hier im Forum gibts ein paar Linklisten dafür. Ich benutze für STL-Kram (wozu auch das vector-Template gehört) die STL-Referenz auf sgi.com (einfach bei google zusätzlich zum Suchbegriff site:sgi.com eingeben, dann findet der das). Für anderes ist www.cppreference.com geeignet.



  • Ok, das schau ich mir gleich mal an.

    Das mit der Erstellung der Größe des Vektors hat ja jetzt funktioniert, jedoch habe ich jetzt ein Problem mit dem Befüllen des Vektors. Wenn ich über Methoden meiner Klasse die Vectoren, wie gewohnt:

    ...
    
    vectorvariable[0].name="Mustername";
    
    ...
    

    vectoren befüllen möchte, bricht mein Programm ab und verursacht einen Fehler.

    Gibt es einen Unterschied zum Zugriff auf Vectoren innerhalb und über Methoden von Klassen?

    Wahrscheinlich ist es wiedermal nur eine kleinigkeit und ich komm nicht drauf.

    Schon mal Danke für die Antwort.

    MfG

    Nysander



  • Hallo

    die Syntax ist grundsätzlich richtig. Dasm Problem liegt woanders. Vor allem must du sicherstelen das auch wirkliczh mindestens 1 Element im vector vorhanden ist.
    Dazu fehlt aber der relevante Code und die vollständoige Fehlerbeschreibung.

    bis bald
    akari



  • Also die Fehlerbeschreibung ist einfach nur, das das Programm, sobald ich etwas in den Vector schreiben möchte, einfach abstürzt. Konsolenfenster geht zu und es gibt eine Windows-Fehler-Meldung.

    Es ist kein Syntax-Error, da ja der Compiler durchläuft; wie du schon gesagt hast.

    Also der Code sieht so aus:

    class Artikel
    {
    
          public:
                Artikel()
                {
                     artikel.reserve(10);
    
                }
    
    //...
    
          private:            
          vector<Artikel> artikel;      
    
          string nummer;
          string preis;
          string name;
          string beschreibung;       
    };
    

    Mehr ist es noch garnicht, da diese möglichkeit der Befüllung und natürlich auch das auslesen der Vectoren Hauptbestandteil meines Programmes ist.

    Im Hauptprogramm Instanziere ich nur das Objekt.

    Durch :

    artikel.reserve(10);
    

    hab ich doch eigendlich bereits 10 Felder angelegt oder nicht?

    Daher müsste es doch gehen... 😞


Anmelden zum Antworten