klassen ausserhalb defineren (nötig) ?



  • meine frage ist, warum ich die klassen bevor ich es benutze, am anfang defineren muss.
    also ungefähr so:

    class Eins;
    class Zwei;
    class Drei;
    
    // klassen deklarieren
    class Eins : puplic virtual Basis::Methode
    {
       // ...
    }
    
    // usw.
    
    int main()
    {
      // ... Klassenaufrufe usw.
    }
    

    hoffe ich konnt mein problem gut rüberbringen und ihr könnt helfen. danke 😕



  • defineren = definieren 🙂



  • Der Compiler muss ALLES was ihm unterkommt kennen. Das heisst er muss nicht nur die Klassen die du verwenden willst kennen, sondern auch jede Variable, jede Konstante, jede Funktion, jeden Typ, usw. Manchmal reicht ihm bereits eine Forward-Deklaration, aber normalerweise gilt es deklarieren und erst dann verwenden.



  • ja schon, aber ich könnte ja auch z.b.

    class Eins
    {
       // ...
    }
    
    class Zwei 
    { 
      // ... 
    }
    
    int main()
    {
       Eins a;
    }
    

    also die klassen direkt deklarieren, ohne sie davor extra zu definieren. gibt es da bestimmte ausnahmefälle ?



  • Hallo,

    ku3 schrieb:

    ja schon, aber ich könnte ja auch z.b.

    class Eins
    {
       // ...
    }
    
    class Zwei 
    { 
      // ... 
    }
    
    int main()
    {
       Eins a;
    }
    

    also die klassen direkt deklarieren, ohne sie davor extra zu definieren. gibt es da bestimmte ausnahmefälle ?

    es handelt sich hier in deinem Falle bereits um Definitionen, und damit gleichzeitig auch um Deklarationen. Offensichtlich sind dir die Begriffe nicht klar, deshalb solltest du den Eintrag in den FAQ's lesen:

    http://www.c-plusplus.net/forum/viewtopic.php?t=61231

    MfG



  • ja stimmt. danke.
    also eigentlich umgekehrt.
    "es handelt sich hier in deinem Falle bereits um Definitionen, und damit gleichzeitig auch um Deklarationen."
    ich versteh eben nicht, wieso ich in manchen fällen eine extra deklaration benötige. das ist eben mein problem. wenn ich die extra deklaration in "einem" programm weglasse, bekomme ich eine fehlermeldung, wo doch eigentlich eine definition reichen sollte... anscheinend nicht. wieso muss in dem fall die klasse noch global bekannt gemacht werden (= deklaration)
    ..., weil man ausserhalb der klasse auf die funktionen zugreicht ? z.b. ->

    /*
    klassen definition Eins, Zwei usw
    */
    
    void Eins::giba()
    {
       return a;
    }
    
    int main() {}
    


  • Hallo,

    vielleicht solltest du auch mal die Fehlermeldung posten, denn dieser Code verursacht einen ganz anderen Fehler: Du schreibst, dass die Funktion void zurückgibt (also nix), du returnst aber ein a, von welchem Typ das auch immer ist.

    Ferner sollte, wenn du die Klasse Eins vorher definiert hast, diesbezüglich kein Fehler auftreten. Du musst natürlich schon in der Klassendefnition die Memberfunktion giba() deklariert haben:

    class Eins{
     public:
        int giba(); // Deklaration der Memberfunktion, natürlich auch kein void
    }
    


  • ja stimmt wieder mal danke. void (= no return). aber das war nur ein spontaner bsp-code.
    danke für den hinweis, die memberfkt innerhalb der klassendefinition zu deklarieren. aber die sind auch schon im programmcode (CORBA) drin. also daran liegts eher nicht. ich kann auch den code nicht bei mir compilieren, weil ich keinen compiler für corba (z.b. mico) zum laufen bringe.
    also wie gesagt es wird mit corba programmiert.
    z.b. die zeile

    class Server_Klasse : public virtual POA_Basis::Klasse_A
    

    also, muss ich z.b. deswegen die klassen am anfang deklarieren

    class Server_Klasse
    

    weil ich noch header-datein include und eben klassen vererbe (POA_Basis), damit die klasse Server_Klasse auch für diese bekannt ist 😕



  • damit mein beitrag nicht untergeht. ich bin immer noch nicht weiter.
    also wie gesagt, muss ich klassen am anfang des codes global "bekannt" machen, - sprich ➡

    class KlasseGlobalMachen;
    

    - damit die klasse auch für aussenstehende objekte, funktion, etc. (= #include, Server - Client schema) bekannt ist?
    da reicht dann wohl eine klassendefinition alleine nicht ➡

    class KlasseGlobalMachen {
       // funktionen ... = klasse definieren
    }
    

    irgendwelche ideen 💡 danke 👍



  • die vorwärtsdeklaration ist nur nötig, wenn zb eine klasse eine andere Klasse braucht, bevor diese definiert ist.

    beispiel1:

    class A;
    class B{//A existiert noch nicht, aber um zeiger auf A* benutzen zu können, braucht man die vorwärtsdeklaration 
        private:
            A* pointer_auf_A;
    };
    class A{//B ist schon deklariert, keine probleme
        private:
            B* pointer_auf_B;
    };
    

    beispiel2:

    //header.h
    class A{
        //irgendetwas
    };
    //programm.cpp
    #include "header.h"
    //in der main
    A test;
    

    wenn du im letzten post was andres meintest,dann übergeh den beitrag einfach :p



  • danke sehr 🙂 das nennt man also vorwärtsdeklaration, damit klassen während der compilerzeit verwendbar sind. danke ich glaube das war, was ich gesucht habe. werde dann mal bisschen am code rumexperimentieren.



  • helper hat wahrscheinlich auch das gemeint 👍


Anmelden zum Antworten