Frage zu Klassen (static)



  • moin moin,
    ist es möglich in einer Klasse 'XYZ' eine Elementvariable des DatenTyps 'XYZ' zu deklarieren und wenn ja, wie muss dann die Syntax aussehen.
    Bei einem Versuch solcher Art kriege ich vom Compiler (g++) immer die Ausgabe :
    " field 'VariablenName' has incomplete Typ "
    Weiß jemand was darüber?
    Danke, arni



  • source ?



  • class MyString  //Header Datei
    {
         ...
         ...
    
        MyString _LOCALE;
    };
    
    // in der .cpp wird dann initialisiert
    
    _LOCALE = "dm_DM@euro";
    
    // aber bis dahin komme ich gar nicht, der Compiler stolpert schon über
    // die Deklaration.
    


  • arni schrieb:

    class MyString  //Header Datei
    {
         ...
         ...
    
        MyString _LOCALE;
    };
    
    // in der .cpp wird dann initialisiert
    
    _LOCALE = "dm_DM@euro";
    
    // aber bis dahin komme ich gar nicht, der Compiler stolpert schon über
    // die Deklaration.
    

    das hier ist ja auch totaler mist 🙂



  • arni schrieb:

    moin moin,
    ist es möglich in einer Klasse 'XYZ' eine Elementvariable des DatenTyps 'XYZ' zu deklarieren

    Überleg dir doch mal, was das bedeutet: Eine XYZ-Instanz enthält also eine weitere Instanz von XYZ als Membervariable. Die wiederum hat natürlich auch wieder eine Instanz von XYZ als Membervariable. Diese natürlich auch, und so weiter und so fort.

    Du siehst, wo das hinführt, und warum das nicht gehen kann?



  • @intrudor:

    Damit hast Du ihm sicher sehr geholfen! 🙄

    @arni:

    Überleg Dir mal, was da passieren müßte, wenn der Compiler es akzeptieren würde.
    Ein Objekt der Klasse MyString enthielte dann ja ein Objekt der Klasse MyString, welches wieder ein Objekt der Klasse MyString enthält, welches wiederum... Du verstehst?
    Außerdem bist Du ja gerade dabei die Klasse zu beschreiben. Du schreibst rein, wie sie aussehen soll und benutzt dabei den Begriff der Klasse selbst.
    Ein Elefant sieht aus wie ein Elefant, dieser wiederum sieht aus wie ein Elefant...
    Wie soll denn da der Compiler jemals rausfinden wie denn nun der Elefant (MyString) aussieht? Garnicht! Und genau das sagt er Dir auch. Die Klasse ist noch nicht volllständig definiert, also darfst Du sie auch noch nicht so verwenden. Du kannst allerdings Referenzen und Zeiger auf die Klassen als Member einfügen, das ist erlaubt, weil die nämlich immer ne bestimmte Größe und ein bestimmtes Verhalten haben, das nicht von der Klasse abhängt.
    Auch eine statische Variable wäre möglich.
    Die beste Lösung hängt wohl hauptsächlich davon ab, was Du erreichen willst.

    MfG Jester



  • Mist zu langsam 😉



  • natürlich funkt das siehe da:

    #include <iostream>
    using namespace std;
    
    class nubi
    {
       private:
    
       public :
                std::string blub;
                nubi *a;
                nubi() {
                       a = new nubi(1);
                       };
                nubi(int x)
                       {
                       };
               ~nubi() { delete a;
                       };
    
    };
    
    //---------------------------------------------------------------------------
    int main()
    {        nubi nix;
             nix.a->blub = "bla";
             // ein dubioser Kommentar platzhalter
    }
    //---------------------------------------------------------------------------
    

    sein fehler ist es nur das er seinem objekt nen string zuweisen will ...



  • Geiler Stil, machst du das immer so? :p



  • Nein, er hat ein echtes Objekt, das geht nicht. Mit Zeigern etc. gibt's, wie ich oben geschrieben kein Problem, deshalb funktioniert auch Dein Beispiel.

    MfG Jester



  • Bashar schrieb:

    Geiler Stil, machst du das immer so? :p

    nö nur als beweis das es geht 😃



  • Jester schrieb:

    Nein, er hat ein echtes Objekt, das geht nicht. Mit Zeigern etc. gibt's, wie ich oben geschrieben kein Problem, deshalb funktioniert auch Dein Beispiel.
    MfG Jester

    tztz mein objekt ist auch sehr sehr echt 🙂



  • Habe das verstanden mit dem Elefanten und so ...
    neu eingehackt:

    //Header Datei
    class MyString
    {
        ...
        static MyStr* _LOCALE;
        static void DefLocale(char* Welche);
    }
    
    // .cpp
    
    void MyString::DefLocale(char* Welche)
    {
         _LOCALE = new MyString(Welche); // Den Rest erledigt der Konstruktor
    }
    
    // Aufruf der static Funktion um die Locale zu definieren erfolgt, ohne dass
    // vorher ein Objekt der Klasse MyString erzeugt wurde, stets zu Beginn des
    // Programms
    
    DefLocale("dm_DM@euro");
    

    Jetzt wird kompiliert, aber beim verlinken der Objektdateien gigts folgende Fehlermeldung: "Undefined reference to MyString::_LOCALE"
    und zwar für jede Stelle an der ich _LOCALE verwende.Beispiel:

    if(setlocale(LC_ALL, _LOCALE->readMe())....
    // readMe() ist ne Zugriffsfunktion auf den gespeicherten Begriff
    

    ... und Danke für die rege Beteiligung und Hilfe
    arni



  • um ehrlich zu sein empfehle ich dir nochmal das C++ Buch zur hand zu nehmen und alles genau nachzuschlagen. Weil in dem Code *oben deut* sind nicht nur Denkfehler sondern auch erhebliche Verständnislücken. imho.

    Maybe denkst dir nu "eh was das fürn arsch" ... aber ich denke das es dir sicher mehr von nutzen wär bissl äps zu lesen wie wenn dir jemand ne musterlösung postet.



  • Für einfach die Zeile

    Es muß

    static MyString * _LOCALE;
    

    heißen

    Außerdem mußt Du für das Element auch noch Speicher reservieren, dazu mußt Du im cpp-File die Zeile

    MyString::MyString * _LOCALE;
    

    einfügen.



  • Jester schrieb:

    Außerdem mußt Du für das Element auch noch Speicher reservieren, dazu mußt Du im cpp-File die Zeile

    MyString::MyString * _LOCALE;
    

    einfügen.

    du solltest meinen ratschlag auch warnehmen wenn du das glaubst was du da schreibst. !!!



  • Könntest Du die Problematik kurz erläutern? Ich seh's grad irgendwie nicht, ansonsten würd ich Dich bitten Dich mal nicht im Ton zu vergreifen.



  • Die Zeile muß

    MyString * Mystring::_LOCALE; heißen...

    ist das ein Grund hier gleich dumm angemacht zu werden?



  • eigentlich ist mein post selbsterklärend. 😕
    p.s. bist du dir wirklich sicher das diese zeile .. speicher reserviert .. 😕



  • Was tut sie denn Deiner Meinung nach?


Anmelden zum Antworten