Problem mit vector.pushback()



  • Ja, aber Print() durchläuft doch eine Schleife, die den gesamten vector Inhalt ausgeben soll! 😕
    Also sollte doch Neu und Neu2 ausgegeben werden, oder?



  • Ja, das tut es - aber jedes Objekt hat einen eigenen Vektor. In Neu.Speicher steht eine Kopie von Neu drin, in Neu2.Speicher eine Kopie von Neu2 (und letztere wird ausgegeben).

    (btw, was macht es für einen Sinn, Kopien von dir selbst lokal zu speichern?)



  • [quote="CStoll"]Ja, das tut es - aber jedes Objekt hat einen eigenen Vektor. In Neu.Speicher steht eine Kopie von Neu drin, in Neu2.Speicher eine Kopie von Neu2 (und letztere wird ausgegeben).

    Achso das war mir nicht bewusst. Wie kann ich denn am einfachsten eigene Objekte in einem Vektor ablegen?
    Der gepostete Code ist nur zum testen, ich möchte später Objekte zum zwischenspeichern in einen vektor ablegen und bei Bedarf nach einem bestimmten Objekt suchen können.

    Danke für eure Hilfe



  • mittels http://www.linuxsoftware.co.nz/containerchoice.png richtigen container aussuchen und dann per intellisens + intelligenz oder google + stl-referenz richtig benutzen.



  • doctorwario schrieb:

    Achso das war mir nicht bewusst. Wie kann ich denn am einfachsten eigene Objekte in einem Vektor ablegen?

    int main()
    {
      std::vector<TestObj> v;
      v.push_back(TestObj(2, 3));
      v.push_back(TestObj(3, 4));
    }
    

    btw, es gibt neben "Antwort Absenden" auch einen "Vorschau"-Button -- sehr nützlich um nachzusehen ob du irgendwelche Tags kaputt gemacht hast...



  • finix schrieb:

    int main()
    {
      std::vector<TestObj> v;
      v.push_back(TestObj(2, 3));
      v.push_back(TestObj(3, 4));
    }
    

    Wie ich das in main() mache is mir klar. Ich will aber ja mittels einer Funktion hin und wieder mal ein Objekt an den Vektor anhängen.
    Ich möchte später in dem Programm (zur Laufzeit) Objekte erzeugen (mit new)
    und dann in dem Vektor abspeichern, bzw darin nach Objekten suchen etc.

    Mit globalen Funktionen klappt das wunderbar, nur mit meiner Klasse nicht.

    @CStoll: Kann ich die Objekte denn irgendwie in den gleichen Vektor speichern?
    z.B. dynamisch mit vector<TestObj*>Speicher; und new?

    Fragen über Fragen...



  • class TestObjekte
    {
    public:
        void save( TestObj* obj )
        {
            speicher.push_back( obj );
        }
        void print()
        {
            for(unsigned int i=0; i<speicher.size(); i++) //Würd ich lieber mit Iteratoren machen
            {
                 cout << speicher[i] << endl;
            } 
        }
    private:
        std::vector< TestObj* > speicher;
    };
    
    int main()
    {
        TestObjekte test;
        TestObj* neu1 = new TestObj(2,3);
        TestObj* neu2 = new TestObj(3,4);
        test.save( neu1 );
        test.save( neu2 );
        test.print();
    }
    

    Ungetested und unvollständig, nur als Idee...



  • Ein static vector sollte es auch tun.



  • doctorwario schrieb:

    class TestObj
    {
    	int x, y;
    	vector<TestObj>Speicher;
    /* ... */
    };
    
    int main()
    {
    	TestObj Neu(2,3);
    	TestObj Neu2(3,4);
    }
    

    Die Frage kannst Du Dir mit etwas Grübeln selbst beantworten:
    Du hast TestObj, welches x, y und Speicher enthält. Du erzeugt zwei Instanzen Neu und Neu2. Das x in Neu ist 2, das x in Neu2 ist 3. Also sind die x beider Instanzen unabhängig voneinander (um nicht zu sagen verschieden). Nun, wie wird es wohl mit "Speicher" sein? Haben Neu und Neu2 den gleichen Vector "Speicher"?

    Wenn Du einen Vector von Zeigern anlegst, statt einen Vector von TestObj, ändert das dann was an dem o.a. Umstand?

    Du kannst aber einen static vector<TestObj> in Dein TestObj legen, denn dieses static bewirkt, dass es den Vector nur ein einziges Mal im Programm gibt, und zwar schon wenn noch garkeine Instanz von TestObj existiert. Ob Du dort allerdings via TestObj::Speichern eine Kopie von *this reinlegen möchtest ist wieder ne andere Frage...



  • Erstmal danke für eure Antworten!

    Ich probier das gleich mal aus.


Anmelden zum Antworten