Anfängerproblem



  • Hi Leute,

    hab' ein kleines Anfängerproblem (länger nicht mehr in C++ programmiert ...). Ich will eine Konstante deklarieren, mit der dann eine Membervariable (== Array) initialisiert wird.

    In meinem Header-File steht ...

    class Foo
    {
      static const int SIZE = 10;
      XYZ i[SIZE];
    public:
      Foo();
    };
    

    ... und es funktioniert natürlich nicht. Warum???

    Thx
    Martin



  • Meine Kristallkugel sagt mir dass die Sterne schlecht für eine Verbindung von FOO mit XYZ stehen.

    Wie wäre es mit ein paar Infos mehr?



  • struct foo {
        static const int sizea = 100;
        enum {sizeb=100};
    
        float x[sizea];
        double d[sizeb];
    };
    

    sollte beides funktionieren, wenn dein Compiler es unterstützt.
    Welchen hast du denn?



  • Schon mal danke für eure Beiträge ...

    @nman: Ich halte es für relativ unwahrscheinlich, dass es mit der Klasse XYZ zusammenhängt, weil die nämlich noch gar nicht richtig geschrieben ist ... Ich stehe mit dem Programm noch ganz am Anfang, ich will eben nur eine dumme Konstante definieren && verwenden und es klappt nicht! Habe gerade den Typ von Klasse XYZ auf int geändert, immer noch dieselben Fehlermeldungen!!

    @davie: Ich benutze MS Visual C++ 6.0 Pro, also sollte der Compiler was auch immer eigentlich können. 😃

    Übrigens, nach Möglichkeit sollte Foo schon eine Klasse bleiben und nicht zu einem struct werden.

    Die 2 Fehlermeldungen, die ich bekomme, helfen mir nix, weil sie sich auf virtuelle Methoden beziehen und nicht auf statische Member-Konstanten.

    HHHHHHHIIIIIILLLLLLLFFFFFFEEEEEE!!!



  • vielleicht solltest du mal die fehlermeldungen posten...



  • Original erstellt von <martin++>:
    @nman: Ich halte es für relativ unwahrscheinlich, dass es mit der Klasse XYZ zusammenhängt...

    Das war auch nicht ernst gemeint, wie bitte soll Dir jemand ohne Fehlermeldungen helfen können?

    Original erstellt von <martin++>:
    Ich benutze MS Visual C++ 6.0 Pro, also sollte der Compiler was auch immer eigentlich können. 😃

    Wie bitte? Google mal nach "VC++ Bugs" oä! 😉
    Der VCpp hat (fast) unendlich viele Fehler!

    Original erstellt von <martin++>:
    Übrigens, nach Möglichkeit sollte Foo schon eine Klasse bleiben und nicht zu einem struct werden.

    Eine struct ist das Gleiche wie sowas:

    class foo
    {
        public:
        // ...
    };
    


  • Gerade wieder eingefallen 😉

    Statische Variablen werden unter C++ nicht in der Klassendeklaration initialisiert, sondern so:

    class Foo
    {
      private:
    
        static const int SIZE;
    };
    
    // ... -> so:
    const int Foo::SIZE = 10;
    

    ... obwohl ich zugebe, dass das das Problem überhaupt nicht löst. Im Gegenteil, auf diese Weise bekommt man nämlich ein ziemlich dickes Abhängigkeitsproblem, was das Array anbelangt. Stellt man besagte Anweisung vor die Klassendeklaration, kennt der Compiler die Klasse Foo noch nicht, hintenangestellt ist aber zu spät, weil dann die Arraygröße nicht bekannt ist.

    Vorschlag: Wir sind in C++ und nicht Weichei-JAVA ;-), also machen wir das halbglobal, auch mit static:

    static const int SIZE = 10;
    
    class Foo
    {
      ...
      int i[SIZE];
    };
    

    "static" hat in diesem Fall nix mehr mit statischen Variablen zu tun, sondern (großes Lob an die C++-Entwickler ...) bewirkt, dass SIZE nur im Modul bekannt ist.



  • laut standard ist folgendes möglich/nötig

    class x {
    public:
       static const int foo = 42;
       static const int foobar = 7;
       static int bar;
    };
    
    const int x::bar = 53; //mit initialisierung
    const int x::foo; //ohne initialisierung
    const int *ptr = &x::foo; //genau deshalb ist obige zeile notwendig
    

    für x::foobar muss ich nichtmal speicher anfordern.

    [ Dieser Beitrag wurde am 12.04.2003 um 20:48 Uhr von davie editiert. ]



  • @Andi: Ja genau, das geht schon in die richtige Richtung ... Aber
    noch eine Frage: Was ist das für eine Logik?? Warum kann ich nicht
    wie in jeder anderen *vernünftigen* Programmiersprache (Java?! :D)
    einfach die Variable direkt bei der Deklaration initialisieren??

    Allgemein, da alles nach den Fehlermeldungen schreit, hier sind sie:

    error C2059: syntax error : 'constant'

    ... und ...

    error C2238: unexpected token(s) preceding ';',

    wobei sich beide Fehler auf die Zeile mit der Konstantendefinition
    beziehen. Irgendwie waren das eben noch andere ... das stimmt wohl,
    dass MSVC++ 6.0 ein bisschen buggy ist.

    Und genau hier kommen wir zum nächsten Problem. Wenn ich das
    Schlüsselwort 'static' entferne, bleibt alles beim alten, immer noch
    dieselben Fehlermeldungen

    Trotzdem danke, dass ihr mir immer noch helfen wollt.
    Martin



  • @davie: Du warst glaub ich gerade schneller als ich, das habe ich erst jetzt gelesen.

    Wisst ihr was, ich compilier den Murks mal mit dem Gcc, vielleicht klappt das ja, oder ich habe irgendwo einen ganz obskuren Fehler?!

    CU
    Martin



  • Original erstellt von Andi:
    **
    "static" hat in diesem Fall nix mehr mit statischen Variablen zu tun, sondern (großes Lob an die C++-Entwickler ...) bewirkt, dass SIZE nur im Modul bekannt ist.**

    das ist deprecated. du solltest dafür in zukunft unbenannte namensbereiche verwenden:

    static const int x = 10; //ist OK, aber deprecated - wird's vielleicht bald nicht mehr geben (oder erlaubt sein)
    
    //mach draus sowas:
    namespace {
       const int x = 10;
    }
    

    hat denselben effekt

    [ Dieser Beitrag wurde am 12.04.2003 um 21:08 Uhr von davie editiert. ]

    [ Dieser Beitrag wurde am 12.04.2003 um 21:09 Uhr von davie editiert. ]



  • Hallo nochmal,

    ich kapier' bald gar nichts mehr.

    Ich habe das jetzt mit dem Gcc versucht, kenne mich damit zwar nicht gut aus, aber ein 'g++ -c datei.cpp' hat anstandslos die *.o-Datei erzeugt. Und wenn ich mit MSVC++ nur die Datei übersetze, anstatt das ganze Projekt mit Build zu übersetzen, gibt es eine neue Fehlermeldung. Sch........ VC++.

    error C2258: illegal pure syntax, must be '= 0'
    error C2252: 'SIZE' : pure specifier can only be specified for functions

    BTW, das Beispiel von davie habe ich nicht kapiert: Was soll diese Zeile

    const int x::foo; //ohne initialisierung
    

    und der Kommentar dadrunter ist mir auch nicht klar

    const int *ptr = &x::foo; //genau deshalb ist obige zeile notwendig
    


  • Wie bitte? Google mal nach "VC++ Bugs" oä!
    Der VCpp hat (fast) unendlich viele Fehler!

    Dass Visual C++ unter die Sparte "besonders buggy" fällt, würde ich nicht behaupten. Jedes Programm, das eine bestimmte Komplexität übersteigt, hat nunmal Fehler und wenn man schon mal als Grundlage für die Anzahl der Bugs eine Googlesuche nimmt, dann möchte ich zumindest mal anmerken, dass die gleiche Suche für den GCC mehr als 10x so viele Seiten auflistet (und für den C++-Builder genau so viele).

    Das eigentlich Problem liegt wohl eher darin -- und das liest man nun wirklich überall, dass der Visual von allen gängigen C/C++-Compilern den ANSI-Standard mit Abstand am schlechtesten erfüllt. Als Bug würde ich das jetzt nicht gerade ansehen, obwohl es natürlich aufs selbe hinausläuft: Es funktioniert nicht 😉



  • IMHO muss man von einem Bug sprechen wenn zB sowas nicht ohne Makro-Hacks funktioniert:

    for (int i = 0; i < 5; ++i)
        foo(i);
    for (int i = 0; i < 10; ++i)
        bar(i);
    

    Ich wüsste nicht was ein besseres Beispiel für einen Compiler-Bug wäre als mangelnde Unterstützung des Standards.

    edit: Ich meinte auch nicht dass er Google-Hits als Messlatte dafür nehmen soll wieviele Bugs der VC++ hat sondern dass er das tun kann um herauszufinden wie viele schwerwiegende darunter sind. Dass die Suche nach GCC-Bugs mehr Treffer ergibt (ich habs nicht nachgeprüft) halte ich aus zwei Gründen für logisch:

    • Die GCC ist eine Compiler-Collection und kein einzelner Compiler
    • GCC ist OpenSource und damit werden die Bugs und deren Behebung in diversen Mailinglisten viel öffentlicher diskutiert als das bei VC++ oder anderer Closed-Software jemals der Fall sein wird.

    [ Dieser Beitrag wurde am 13.04.2003 um 00:49 Uhr von nman editiert. ]


Anmelden zum Antworten