Forum: PC-Programmierung [c++] memberfunktion in const-nes überladen


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,

Ich habe häufiger sowas im Code:
1
class A
2
{
3
  public:
4
          IrgendWas& getIrgendwas()     { return iw; };
5
    const IrgendWas& getIrgendwas()const{ return iw; };
6
7
  private:
8
    IrgendWas_t m_iw;
9
}

In dem Fall ist die funktion getIrgendwas trivial, aber in einigen ist 
da mehr code drin.

gibt es eine elegante Möglichkeit, dass ein getter den anderen aufruft?

das const vom this wegcasten zählt für mich nicht als elegant ;)

von Peter II (Gast)


Lesenswert?

warum sollte man ein const wegcasten? wenn sie wirklich const ist kann 
man auch so darauf zugreifen.

Wenn wirklich beide gleich sind, dann braucht du NUR die Const methode.

von Arno (Gast)


Lesenswert?

Hallo,

guck mal in die c++faq:
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12

Ansonsten ist das Zurückgeben einer Non-Const-Referenz auf einen 
privaten Member eher schlecht. Du kannst den privaten Member so 
ausserhalb deiner Klasse verändern.

Gruss
Arno

von Vlad T. (vlad_tepesch)


Lesenswert?

Peter II schrieb:
> Wenn wirklich beide gleich sind, dann braucht du NUR die Const methode.

man will dem Aufrufer ja aber einmal ein veränderbares Objekt liefern 
und einmal ein konstantes.

von Εrnst B. (ernst)


Lesenswert?

Vlad Tepesch schrieb:
> man will dem Aufrufer ja aber einmal ein veränderbares Objekt liefern
> und einmal ein konstantes

Damit Sachen wie

object->getIrgendwas()+=42;

funktionieren?

von Karl H. (kbuchegg)


Lesenswert?

Εrnst B✶ schrieb:
> Vlad Tepesch schrieb:
>> man will dem Aufrufer ja aber einmal ein veränderbares Objekt liefern
>> und einmal ein konstantes
>
> Damit Sachen wie
>
> object->getIrgendwas()+=42;
>
> funktionieren?

Auf der anderen Seite:

  Auto Opel;
  Opel.Fenster().Close();

soll compilierbar sein
allerdings sollte

  const Auto Ford;
  Ford.Fenster().Close();

ein Fehler sein.

Wohingegen

 const Auto Ford;
 if( Ford.Fenster().IsClosed() )
   ...

wieder in Ordnung sein soll.

Ich seh jetzt keinen Weg, wie ich das ohne 2 verschiedene Fenster() 
Member erreichen könnte.

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ...
super Beispiel, danke ;)

von Vlad T. (vlad_tepesch)


Lesenswert?

Arno schrieb:
> Du kannst den privaten Member so
> ausserhalb deiner Klasse verändern.

was meinst du machen die ganzen std-container-Klassen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.