problem mit const



  • hi folgendes problem:

    ich kann euch leider keinen code posten (waere viel zu lang) aber ich hoffe ich kann mein problem schildern:

    ich habe ne methode einer klasse A die z.B. foo heisst und ungefaehr so aussieht:

    int A::foo(SomeClass s){return 4;}
    

    (is nur ein beispiel bitte nicht ernst nehmen was der sinn sein soll)

    dann gibt es da eine andere methode foo2 der gleichen klasse die ungefaehr so aussieht:

    void A::foo2(const A &a)
    {
       a::iterator it_b = a.begin();
       a::iterator it_e = a.end();
       while(it_b!=it_e)
       {
         int x = foo(*it_b);   // hier gibts fehler bei compiler
         ++it_b;
        }
    }
    

    das uebergebene A-Objekt hat iteratoren (wie STL) die auf SomeClass-Obj. zeigen.

    Das Problem ist: mein Compiler will die markierte zeile nicht uebersetzen. Die Fehlermeldung ist (ungefaehr) so:

    "... passing const A as 'this' in ..." und bezieht sich auf oben markierte zeile.

    Ich habe schon jemanden dazu gefragt aber seine antwort nicht ganz verstanden (kann diesen jemand leider nicht mehr fragen). Er sagte dass ich die methode foo const machen soll. daraufhin habe ich das argument von foo als const geschrieben wie:

    int A::foo(const SomeClass s){return 4;}
    

    aber ich bekomme gleiche fehlermeldung.

    Warum nur 😕

    vielen dank.



  • Die Antwort von "Jemand" war wohl schon richtig: Mache foo() const. Was du gemacht hast war, das Argument von foo() const zu machen, nicht die Methode selbst. Das sähe so aus:

    int foo(SomeClass s) const;
    

    Es ist übrigens keine schlechte Idee, das Argument von foo() als konstante Referenz und nicht als Kopie zu übergeben:

    int foo(const SomeClass &s) const;
    

    Stefan.



  • Ausserdem sollten die Iteratoren vom Typ const_iterator sein.



  • ok .. war wiedermal meine schuld, ich war zu voreilig und habe nicht gemerkt das ich haette vorher suchen muessen .. es gab naemlich ne menge posts die das gleiche problem beinhalteten :))

    trotzdem vielen dank, habs gerafft.

    gruss



  • Hi,
    ich mal wieder.
    Ich dachte ich haette das const-prob. aus der welt geschafft aber irgendwie ist es aus der geisterwelt wieder zurueckgekehrt und laesst mich gerad den blanken horror erleben:

    ich habe folgende (kurze) methode:

    template<NODEDATA, EDGEDATA>
    void DataGraph<NODEDATA, EDGEDATA>::copyGraph(const DataGraph<NODEDATA, EDGEDATA> &dg, list<node>::const_iterator begin, list<node>::const_iterator end)const
    {
       node_map<node> copy(dg, new_node());
       graph::node_iterator own_nodes_begin;
       graph::node_iterator own_nodes_end;
       for(own_nodes_begin=begin, own_nodes_end=end; own_nodes_begin!=own_nodes_end; ++own_nodes_begin)
      {
        copy[*n_it] = new_node();   // hier fehler !
        ++n_it;
      }
    }
    

    die iteratoren sind wie aus der stl.
    meine fehlermeldung lautet:

    "...passing DataGraph<string, string> as 'this' argument of 'node graph::new_node()' discards qualifiers..."

    und bezieht sich auf die oben markierte zeile. Ich hab aber keine ahnung was damit gemeint ist, da fuer mich der code syntaktisch korrekt ist.

    irgendwelche ideen ? (zusatzinfo: die fehlermeldung aus meinem letzten post war so aehnlich, jedoch diesmal passiert kein aufruf einer methode die ein const-obj bekommt oder selbst const gemacht werden muss damit sie keine variablen aendert, also warum?)

    vielen dank.

    gruss



  • ich bin wiedermal viiieeel zu voreilig gewesen mit dem posten (erst denken dann schreiben).

    Wers wissen will:

    die methode copyGraph ist als const deklariert worden und darf damit nix aendern, der Aufruf der methode new_node() tut dies aber :))

    trotzdem danke.

    gruss


Anmelden zum Antworten