Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Designfrage const member

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.04.2011, 04:02 Uhr
Lensflare



Hallo.

ich hab mir da was überlegt und ich weiss nicht so Recht ob das eine gute Idee ist oder nicht.

Erstens:
Wenn man eine Klasse hat, die konstante Membervariablen besitzt, ist es grundsätzlich besser diese auch static zu machen?
Was wäre ein Anwendungsfall für eine konstante, nicht statische Membervariable?
Bei C# sind zum Beispiel Konstanten immer statisch (so weit ich das verstanden habe).

Zweitens:
wenn ich eine konstante Membervariable habe (egal ob statisch oder nicht), und ich möchte aus Konsistenzgründen per Getter auf diese zugreifen...


C++:
class A {
private:
    static const float f;

public:
    static inline float GetValue() { return f; }
};

const float A::f = 5.0f;



...dann könnte ich ja auch genau so gut diese Konstante als Variable weglassen und stattdessen den wert der konstanten direkt inline im getter zurückgeben.

C++:
class A {
public:
    static inline float GetValue() { return 5.0f; }
};



Ansonsten macht es einen etwas redundanten Eindruck. Gibt es einen Grund sowas nicht zu tun?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 23.04.2011 um 04:07 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.04.2011, 05:52 Uhr
0xdeadbeef
Gott
(Operator)


Du kannst für jedes Objekt einen anderen Wert einer Member-Konstante haben - im Grunde versprichst du damit nur, dass sich der Wert nach Konstruktion des Objekts nicht mehr ändert. Diesen Mechanismus braucht man in der Praxis allerdings eher selten.

Ansonsten gilt: Prinzipiell ist es wichtiger, die Schnittstelle sauber zu halten als die Implementationdetails. Wenn sich später an der Implementation etwas ändert und deshalb nicht nur die Klasse, sondern auch der Code, der sie benutzt, geändert werden muss, ist das schlecht. Dementsprechend kann es sinnvoll sein, statt die Konstante direkt als Variable nach außen zu geben eine Methode zu benutzen (wenn etwa die Möglichkeit besteht, dass in der Zukunft mal statt einfachen Durchreichens eine Berechnung stattfinden soll), aber ob diese Methode jetzt eine Klassenkonstante durchreicht oder den Wert direkt hart verdrahtet hat, ist eigentlich ziemlich gleichgültig. Sollte mal ein Problem damit entstehen, kann man es ohne große Probleme ändern.

Allerdings: Wenn diese Möglichkeit völlig ausgeschlossen ist, ist es unter Umständen sinnvoll, die Konstante direkt public zu machen, damit sie ggf. beispielsweise als Template-Parameter benutzt werden kann.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.04.2011, 13:06 Uhr
ao

(Operator)



Zitat von Lensflare:
Was wäre ein Anwendungsfall für eine konstante, nicht statische Membervariable?



C++:
class Tier
{
private:
  const int anzahlBeine;
  
public:
  Tier (int anzahlBeine_)
  : anzahlBeine (anzahlBeine_)
  {
  }
};

int main (void)
{
  Tier hund (4);
  Tier mensch (2);
  Tier fisch (0);
  return 0;
}



Wenn man davon ausgeht, dass keine Amputation und ähnliches stattfindet, ist die Anzahl der Beine auf Lebenszeit konstant.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.04.2011, 02:07 Uhr
Lensflare



Gutes Beispiel.
Danke euch beiden.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.04.2011, 23:04 Uhr
kronos
Quotenfisch
(Operator)



Zitat von ao:


C++:
class Tier
{
private:
  const int anzahlBeine;
  
public:
  Tier (int anzahlBeine_)
  : anzahlBeine (anzahlBeine_)
  {
  }
};

int main (void)
{
  Tier hund (4);
  Tier mensch (2);
  Tier fisch (0);
  return 0;
}



Wenn man davon ausgeht, dass keine Amputation und ähnliches stattfindet, ist die Anzahl der Beine auf Lebenszeit konstant.


Sind dafür nicht templates?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 29.04.2011 um 23:05 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.05.2011, 02:17 Uhr
Lensflare



Wenn man es mit templates machen würde, dann könnte man ja Tiere, die nicht die selbe Anzahl Beine haben nicht in ein
Tier* array[5];
stecken, weil es dann unterschiedliche Klassen wären.

Aber andererseits wäre es möglich, dass man genau das möchte ^^
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 01.05.2011 um 02:18 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.05.2011, 20:49 Uhr
kronos
Quotenfisch
(Operator)



Zitat von Lensflare:
Wenn man es mit templates machen würde, dann könnte man ja Tiere, die nicht die selbe Anzahl Beine haben nicht in ein
Tier* array[5];
stecken, weil es dann unterschiedliche Klassen wären.

Kann man eine Basisklasse benutzen... Vermutlich ist es einfach egal...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.05.2011, 21:47 Uhr
ao

(Operator)


Extra eine Basisklasse einführen, nur damit man den Kram durch den Compiler kriegt? Für eine Ableitungshierarchie sollte man stärkere Gründe haben, meine ich.

Aber es stimmt schon: Ob Templates das passende Mittel sind oder Ableitung, das richtet sich nach dem Zweck des Ganzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: