VAriablen Übergabe in einem Methodenaufruf, syntax verständnis



  • Hallo,

    ich bin sowohl ein C++ als auch ein Foren Anfäger.
    Ich soll im Rahmen meiner Diplom Arbeit fremden C++ Code nachvollziehen können.
    Dabei handelt es sich um ein Projekt aus mehreren cpp und h files.
    Der Teil des SourceCode, den ich nicht verstehe:

    Bool_t CBDecayUnpacker::operator()(const Address_t pEvent,
                                CEvent&         rEvent,
                                CAnalyzer&      rAnalyzer,
                                CBufferDecoder& rDecoder)
    

    Soweit ich das zu verstehen glaube, ist CBDecayUnpacker eine Klasse und operator eine Methode. Meine Fragen:

    1. warum sind die zu übergebenden VAriablen bei dem Mehodenaufruf ("CEvent& rEvent", "CAnalyzer& rAnalyzer") immer paarweise aufzufinden. Im quelltext,der diesem Aufruf folgt, ist jeweils nur die zweitgenannte Variable zu finden ("rEvent]", "rAnalyzer]", "rDecoder]" und "pEvent").
      (Was ich erwartet hätte bei einem Methodenaufruf ist etwas in der Art <Methode>(int <variable1>, int <variable2>, double <variable3>) )

    2. warum haben einige der variablenpaare ein nachgestelltes & ("CEvent&]")... sind das dann lediglich SpeicherAddressen ?

    3. hinter dem operator die erste klammer auf, klammer zu "operator()", was bedeutet die ?

    4. Was bedeutet das "Bool_t]" ? Ist das eine spezielle "Bool" definition ? In dem Projekt habe ich einen grep nach "Bool_t" ausgeführt und nichts entsprechendes gefunden. Im internet finde ich <Variablenart>_t durchaus, aber leider ohne Erklärung.

    Ich hoffe es kann mir jemand weiterhelfen, damit ich diese Aufrufe nicht einfach als black box akzeptieren muß. Ich hoffe natürlich ebenso, das ich die Form einen Forumbeitrages erfüllt habe.

    Viele Grüße und danke für eure Mühe
    Asupernova



  • Am besten du holst dir ein C++ Buch und lernst erstmal die Grundsyntax, das würde dir schon enorm helfen.



  • Hallo,

    also um dem geschimpfe über neulinge zuvorzukommen, ich habe mir sowohl die online skripte angesehen als auch ein c++ buch gekauft. Allerdings ist es nun mal so, dass man aus meiner sicht Programmieren nicht aus büchern sondern duch anwenden und durch Austausch mit anderen lernt. Ich bin immer noch dabei mir das Buch und die kurse anzuschauen...
    Ich erwarte hier ja auch keine vorlesung, aber wer sich die mühe macht zu antworten, da würde ich doch wünschen, dass es über bloße Phrasen wie "..holst dir ein Buch.." hinausgeht.
    Gruß
    Asupernova



  • asupernova73 schrieb:

    Bool_t CBDecayUnpacker::operator()(const Address_t pEvent,
                                CEvent&         rEvent,
                                CAnalyzer&      rAnalyzer,
                                CBufferDecoder& rDecoder)
    

    Soweit ich das zu verstehen glaube, ist CBDecayUnpacker eine Klasse und operator eine Methode.

    Nein, die Methode heißt operator() . Es handelt sich um einen überladenen Operator.

    Meine Fragen:

    1. warum sind die zu übergebenden VAriablen bei dem Mehodenaufruf ("CEvent& rEvent", "CAnalyzer& rAnalyzer") immer paarweise aufzufinden. Im quelltext,der diesem Aufruf folgt, ist jeweils nur die zweitgenannte Variable zu finden ("rEvent]", "rAnalyzer]", "rDecoder]" und "pEvent").
      (Was ich erwartet hätte bei einem Methodenaufruf ist etwas in der Art <Methode>(int <variable1>, int <variable2>, double <variable3>) )

    Sind sie nicht. CEvent& ist der Typ, rEvent der dazugehörige Variablenname (bzw. Parametername in dem Fall). So wie in deinem Beispiel int oder double der Typ ist.

    1. warum haben einige der variablenpaare ein nachgestelltes & ("CEvent&]")... sind das dann lediglich SpeicherAddressen ?

    Das sind Referenzen.

    1. hinter dem operator die erste klammer auf, klammer zu "operator()", was bedeutet die ?

    Siehe oben, das ist ein überladener Operator. Einfacher zu verstehen ist für den Anfang sowas wie operator+ , aber () ist auch "nur" ein Operator, der für den Funktionsaufruf steht.

    Eine Klasse mit einem überladenen operator() kann als Funktionsobjekt benutzt werden. Hier also z.B.:

    CBDecayUnpacker einUnpacker;
    einUnpacker(eineAddresse, einEvent, einAnalyzer, einDecoder); // <- sieht aus wie ein Funktionsaufruf, ist aber in Wirklichkeit ein Aufruf der operator()-Methode
    
    1. Was bedeutet das "Bool_t]" ? Ist das eine spezielle "Bool" definition ? In dem Projekt habe ich einen grep nach "Bool_t" ausgeführt und nichts entsprechendes gefunden. Im internet finde ich <Variablenart>_t durchaus, aber leider ohne Erklärung.

    Das ist jedenfalls kein Standardtyp. Bist du sicher, dass in dem Projekt nirgends Bool_t auftaucht? Vielleicht in einer dazugebundenen Bibliothek.

    Ich hoffe, du siehst ein, dass das etwas zu komplexe Materie ist, um sie bei deinen Kenntnissen mal eben übers Forum zu erklären.



  • Hi,
    ich bin zwar selber ein c++ Neuling, aber werde mal versuchen mein bisheriges Wissen mit dir zu Teilen :p

    CBDecayUnpacker ist eine Klasse.

    operator()
    ist eine in der Klasse definierte Funktion, also Methode.

    Die Klasse könnte beispielsweise folgendermaßen aussehen.

    class CBDecayUnpacker{
    privat:
    int Beispiel1, Beispiel2;
    string Beispiel3;
    
    public:
    int Beispiel_Funktion1();
    int Beispiel_Funktion2();
    int operator(const Address_t pEvent,
                                CEvent&         rEvent,
                                CAnalyzer&      rAnalyzer,
                                CBufferDecoder& rDecoder);
    
    };
    
    1. warum haben einige der variablenpaare ein nachgestelltes & ("CEvent&]")... sind das dann lediglich SpeicherAddressen ?

    Das ist eine "neuartige" Form des im ANSCI C bekannten Pointers.
    Gennant wird das ganze Referenz, hier wird ebenfalls nicht die Variable neu
    erstellt sondern lediglich auf die Speicheradresse der ursprünglichen Variablen
    zurück gegriffen.
    Anderst als beim C - Pointer bleibt bei der Referenz die Adresse immer Fest,
    d.h. man kann keine Refernz auf NULL zeigen lassen.

    z.B.

    #include<iostream>
        using namespace std;
    
        void tausche(int&, int&);
    
        int main()
        {
          int a=2;
          int b=5;
          cout<<"a = "<<a<<"\nb = "<<b<<"\n";
          tausche(a,b);
          cout<<"a = "<<a<<"\nb = "<<b<<"\n";
        }
    
        void tausche(int& a, int& b)
        {
          int temp=a;
          a=b;
          b=temp;
        }
    

    Was ist Bool_t?
    Ich vermute eine speziell selbst definierter Fall von
    Bool z.B.

    typedef enum { 
        TRUE  = 1, 
        FALSE = 0 
    } bool_t;
    


  • oh sry,
    Bashar war wohl schneller 🙂



  • Danke schon mal, eine komplette erklärung habe ich gar nicht unbedingt erwartet, aber mit einigen "sachdienlichen Hinweisen" wie du sie netterweise präsentiert hast.
    Jetzt kann ich schon mal nachschauen/lesen, wie eine Referenz ein Variablentyp sein kann. Denn dass das & für Referenzen Steht hatte ich gelesen, ich hatte das nur so verstanden, dass dies dann lediglich Speicheraddressen sind, die auf gewisse Inhalte zeigen, aber jetzt weiß ich schon mehr als zuvor.

    Gruß
    Asupernova



  • ... Antworten übersehen ...



  • Danke nochmal, da war ich wohl zu langsam 😞 .Das muss ich mir nachher mal in Ruhe anschauen...


Anmelden zum Antworten