C** Code lesen und verstehen



  • Hallo,

    ich versuche zur Zeit einen C++- Code zu lesen und zu verstehen. Einiges ist klar Allerdings kenne ich diese Darstellung nicht:

    Bridge::Bridge (CInterrupt *pInterrupt)
    :	m_pInterrupt (pInterrupt),
    	m_pTimer (CTimer::Get ()),
    	m_num_wins (0),
    	m_num_ranges (0),
    	m_num_scbs (0),
    	m_si (0)
    {
    }
    

    Wahrscheinlich kennt ihr diese Struktur, aber leider konnte ich dazu nicht wirklich etwas finden. In den Tutorials, die ich verwendete, gab es diese Art der Klassenerstellung nicht.

    Was bedeutet dieses ":". Genauso die Funktionen(?)/ Variablen(?), die im Anschluss hier stehen.

    Macht die Funktion überhaupt etwas, da kein Code zwischen den geschweiften Klammern steht? Wobei das Quatsch sein muss, da ich weiß, dass ja was passiert.

    Gibt es eigentlich Programme, bei denen ich den Sourcecode laden kann und mir gezeigt wird, wie die Klassen voneinander abhängig sind? Das Programm, welches ich versuche zu analysieren erzeugt eine Libary, die in den Beispielen verwendet wird.

    Vielen lieben Dank, Matthias



  • Das nennt sich Initialisierungsliste.

    Für deine 2. Frage schau dir mal doxygen an - damit kannst du eine Hilfe erzeugen, welche optional auch einen Abhängigkeitsgraphen dazu anlegt: Graphs and diagrams.



  • Danke für die Antwort!

    Können in dieser Liste dann auch Funktionen sein, die bei der Initialisierung dann verwendet werden? Laut WIKI sind das ja Konstanten und dann dadurch etwas widersprüchlich...

    Bei der Auswertung des Codes kann ich auch zum Teil nicht finden, welche das dann sind, deswegen dann auch diese zweite Frage. Ich werde mal Doxygen anschauen...

    Gruß, Matthias


  • Mod

    @satyria1234 sagte in C** Code lesen und verstehen:

    Können in dieser Liste dann auch Funktionen sein, die bei der Initialisierung dann verwendet werden? Laut WIKI sind das ja Konstanten und dann dadurch etwas widersprüchlich...

    CTimer::Get () ist doch eine Funktion…

    Ansonsten bitte nochmal Textverständnis üben:

    @Wikipedia schrieb in dem verlinkten Artikel:

    […] Fälle, in denen eine sofortige Initialisierung nötig ist:

    • In C++ ist es möglich, Variablen per Deklaration unveränderlich zu machen. Das geschieht durch Voranstellen des Schlüsselwortes const. Man muss einer solchen Variable allerdings mit der Deklaration bereits einen Wert zuweisen.

    Da steht nicht, dass die Ausdrücke in der Liste Konstanten sein müssen. Der Sinn des Satzes ist ein komplett anderer.



  • Hi @satyria1234 ,
    zu Deiner Frage "Können in dieser Liste dann auch Funktionen sein", kenne ich nur den Aufruf des Konstruktors einer Oberklasse mit Parametern.



  • Danke Euch!!!

    Also zu diesem Beispiel oben:

    Grundlegend ruft diese Klasse bestimmte Dinge (wahrscheinlich aus der Libary) auf. Die Class "CTimer::Get" ist klar, die "pInterrupt" kann ich im Sourcecode allerdings nicht wirklich finden...

    m_pInterrupt (pInterrupt),
    m_pTimer (CTimer::Get ()),
    

    Die

    m_num_wins (0),
    m_num_ranges (0),
    m_num_scbs (0),
    m_si (0)
    

    sind wahrscheinlich "Variablen". Sind diese dann nur innerhalb der Klasse gültig?

    Gruß, Matthias


  • Mod

    Gehe ich recht in der Annahme, dass du trotz der Erklärung, dass das eine Initialiserungsliste ist, nicht versucht hast, irgendetwas über Initialisierungslisten zu lesen?

    Wobei das Wikipediabeispiel furchtbar ist. Aber in den anderen üblichen Referenzen findet man leicht etwas:
    https://en.cppreference.com/w/cpp/language/constructor

    PS: Oder sprichst du gar kein C++ und versuchst trotzdem, C++ zu verstehen? Sprichst du andere Programmiersprachen? Dies hier ist schon ein etwas gehobenes Thema, da braucht es zumindest grobes Verständnis des C++-Objektmodells für, oder ähnliche Konzepte aus anderen Sprachen, anhand derer wir das dann erklären können.



  • Danke Dir und Ja, meine Sprache ist nicht C++. Ich lebe in der Welt von C und Assembler. Leider ist der Code, den ich verstehen will in C++ geschrieben und Internetweit der einzige, der mein Problem gelöst hat. Er steht unter der GNU GENERAL PUBLIC LICENSE (Version 3, 29 June 2007) und leider sehr schlecht dokumentiert. Selbst eine Anfrage beim Autor erbrachte mir keine Erkenntnisse...

    Gruß, Matthias


  • Mod

    Hast du ein Konzept von Objektorientierung, und was Klassen damit zu tun haben?

    Aber prinzipiell ja, das sind Variablen, die nur in der Klasse gelten. Die Deklaration derselben muss auch an anderer Stelle in der Klassendefinition stehen, dies hier setzt nur den Anfangswert bei der Instantiierung eines Objekt der Klasse.

    Das pInterrupt in m_pInterrupt (pInterrupt), stammt buchstäblich aus der Zeile darüber, wo es ein Parameter der Funktion ist.



  • Ok, danke, werde da jetzt mal weiter durchforsten...

    Bevor ich mich daran gemacht habe, habe ich mich tatsächlich in C++ eingelesen und dachte, dass ich es verstanden habe, aber genau solche Initialisierungslisten waren da nicht dabei. Es ist auch schwierig in diesem Fall, da hier Libaries geschrieben werden und die Beispiele dann diese verwenden... Egal, versuche mich weiter und frage dann einfach hier nochmal, wenn ich hängen bleibe.

    Gruß, Matthias


Anmelden zum Antworten