Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Initialisierung von members bei Deklaration

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
06.10.2006, 16:33 Uhr
Pler
Einer von Vielen
(Operator)


Hallo!
Ich habe folgendes:


C++:
class konf{
public:
        static const int i = 1;
        static const char* str = "Hallo!";
};



compiler:
error: invalid in-class initialization of static data member of non-integral type


Also das mit i funktioniert ja. Aber leider nicht mit dem String. Das ist mir noch nie aufgefallen.
Kann ich das irgendwie umgehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.10.2006, 16:53 Uhr
Blubber2063



Hmm, naja vielleicht indem du die Feldgröße angibts also

C++:
static const char str[7] = "Hallo!";


Ohne es getestet zu haben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.10.2006, 17:29 Uhr
Pler
Einer von Vielen
(Operator)


Nein, das bringt nichts.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.10.2006, 17:53 Uhr
Blubber2063



Hmmm, scheint als geht das wirklich nur mit atomaren Typen, weder Objekte noch Zeiger akzeptiert er. Komische Sache.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.10.2006, 18:14 Uhr
0xdeadbeef
Gott
(Operator)


Initialisieren (und instanziieren) musst du statische Member außerhalb der Klassendeklaration - da werden sie nur deklariert. Sinnigerweise sollte das auch außerhalb der Header-Datei passieren, sonst hast du nämlich in jedem Modul nachher eigene statische Member der Klasse, oder vielleicht gibts auch nen Linkerfehler, da bin ich grad nicht ganz sicher. Jedenfalls:

C++:
// konf.hh

class konf{
public:
        static const int i = 1;
        static const char* str;
};

// konf.cc

#include "konf.hh"

char const *konf::str = "Hallo!";


Für Integer gibts da ne Ausnahme, weil die dann vom Compiler wegoptimiert werden können.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.10.2006 um 18:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.10.2006, 18:30 Uhr
Pler
Einer von Vielen
(Operator)


Aja. So würde es natürlich gehen.

Ich schreibe mal wöfür ich das eigentlich nehmen will, vielleicht hat ja auch jemand ne bessere Idee.
Ich habe zum Beispiel Radio-Button. Der Wert kann durch eine Konfigdatei gesetzt werden. Der Wert steht in der Konfigdatei hinter einem bestimmten String. So ein Radiobutton kann natürlich nur bestimmte int-Werte annehmen, denen immer ein bestimmter Sinn zugeordnet ist.
Nun _wollte_ ich sowas schreiben:


C++:
class Radio_System{
public:
  static const string konfstr = "system="
  int value; // wird dann später gesetzt
  static const int windows = 1;
  static const int linux = 2;
  static const int mac = 3;
}radio_System;

So, dass ich das später im Programm so verwenden kann:

C++:
if( radio_System.value == radio_System.windows ) {
  cout << "hmpff..." << endl;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.10.2006, 19:28 Uhr
0xdeadbeef
Gott
(Operator)


Anstatt der ints würd ich ne enum nehmen. Den String kannste, wie oben geschildert, ja einfach in der source-Datei setzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.10.2006, 20:44 Uhr
Pler
Einer von Vielen
(Operator)


An enums hab ich auch schon gedacht, aber da fehlt mir etwas der Durchblick.
Soll ich das(oder den) enum in der Klasse deklarieren?
Wenn ich das ausserhalb mache, dann ist das ja wieder gobal?

Nachtrag:
enum einfach in die Klasse rein funktioniert super. So werde ich das dann wohl machen.


C++:
class Radio1{
public:
  enum { windows , linux , mac } value;
}



C++:
Radio1 radio1;
radio1.value = radio1.windows;



Kannst du mir noch erklären, wo das Problem liegen soll, wenn ich die Stringzuweisung in den Header schreibe?
Ich hab mir bisher noch nie Gedanken darüber gemacht, da ich immer alles wie's soll in .cpp und .h getrennt habe.
Aber hier würde es eben besser passen alles im Header zu machen, da man dann gleich alles auf einen Blick hat.

Dieser Post wurde am 06.10.2006 um 21:06 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.10.2006, 22:21 Uhr
0xdeadbeef
Gott
(Operator)


Im Header kannst du sie nicht definieren, weil sie dann in jedem Modul einzeln instanziiert wird, und sich dann nachher der Linker beschwert, dass er nicht weiß, welche der paar Millionen gleichnamigen Instanzen er denn jetzt benutzen soll.

Wenn dus unbedingt im Header stehen haben willst, schreib nen Kommentar rein, oder, wenn dich die pollution des namespaces nicht stört, mach ein #define und benutz das in der source-Datei.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: