->



  • Hallo!

    Was ist daran falsch?

    CFisch* m_Fische = new CFisch[10];
    for (int i = 0; i < 10; i++)
      m_Fische[i]->Init();
    

    der Compiler spuckt an der 3. Zeile aus:
    Der Typ 'CFisch' hat keinen ueberladenen Elementoperator '->'

    wie muss es denn richtig heißen?



  • [i] löst den Zeiger schon auf du musst also . statt -> verwenden.

    Und nimm lieber ++i statt i++.

    MfG MAV



  • Mis2com schrieb:

    Und nimm lieber ++i statt i++.

    Das ist doch hier völlig wurscht.



  • Optimizer schrieb:

    Mis2com schrieb:

    Und nimm lieber ++i statt i++.

    Das ist doch hier völlig wurscht.

    aber eben nur hier. bei map<std::string, int>::iterator isses bestimmt nicht wurscht.



  • Optimizer schrieb:

    Mis2com schrieb:

    Und nimm lieber ++i statt i++.

    Das ist doch hier völlig wurscht.

    Gerade weil es wurscht ist, würde auch ich empfehlen, Präinkrement zu verwenden, damit man sich angewöhnt, Postinkrement nur da zu benutzen, wo der Seiteneffekt wirklich gebraucht wird.



  • Was ist daran falsch?

    Das du die Aufgabe, die der Konstruktor übernehmen sollte, an eine Methode Namens Init delegierst?



  • Ja.
    Wenn man die Konstruktoren aber einzeln aufrufen möchte, was ja mit einem normalen Zeiger, den man mir mehreren Elementen erzeugt nicht geht, kann man hier einfach einen Doppelzeiger verwenden: (gehe jetzt mal davon aus, dass die Aufgabe deswegen verschoben wurde)

    CFisch** m_ppFisch;
    m_ppFisch = new CFisch*[10];
    for(int n = 0; n < 10; ++n)
       m_ppFisch[n] = new CFisch([...]);
    

    Am Ende muss dann für beides der Speicher freigegeben werden.

    MfG MAV



  • und noch etwas besser wäre ein std::vector mit reserve und push_back



  • Und boost::shared_ptr </standardkommentar> 🙂



  • MFK schrieb:

    Optimizer schrieb:

    Mis2com schrieb:

    Und nimm lieber ++i statt i++.

    Das ist doch hier völlig wurscht.

    Gerade weil es wurscht ist, würde auch ich empfehlen, Präinkrement zu verwenden, damit man sich angewöhnt, Postinkrement nur da zu benutzen, wo der Seiteneffekt wirklich gebraucht wird.

    Was für ein Seiteneffekt?
    Kann mir das jemand erklären?

    THX



  • Postinkrement liefert eine Kopie von sich selbst zurück und inkrementiert dann. Präinkrement inkrementiert sofort. Bei integralen Typen und Pointern wird ein unsinniges Postinkrement zu einem schnelleren Präinkrement optimiert. Bei eigenen Objekten aber nicht, da die beiden überladenen unären Operatoren ++ völlig verschiedene Dinge machen können. Man muss sich immer im klaren sein was man will und dann entscheiden ob man Pre- oder Postinkrement benutzt.

    int a = 5;   // a hat den Wert 5
    int b = a++; // b hat den Wert 5
    int c = ++a; // c hat den Wert 7
    

    Einleuchtend?

    PS: In den FAQ steht aber glaub' ich auch was dazu.


Anmelden zum Antworten