Reine "inline"-Klasse - Auswirkung auf Compilierung?



  • Hallo zusammen,

    bin gerade auf Fehlersuche in meinem Programm und dabei an einer Stelle angekommen, bei der ich eine Klasse komplett nur im Header deklariert und definiert habe.
    Leider beschäftige ich mich nur sehr selten mit C++ und bin mir daher nicht mehr 100% sicher, was dies Ganze bewirkt? Soweit ich weiss, werden für inline-Funktionen überall im Code Kopien angelegt. Wie ist das aber mit einer vollständigen Klasse, wenn man Objekte davon an anderer Stelle erzeugt?

    Bei meiner Klasse verhält es sich seltsamerweise so, dass die Adresse eines Objektes dieser Klasse auch immer identisch ist mit der Adresse eines Klassenmembers (hier struct Rectangle)! Sowas darf doch gar nicht sein, oder?
    Könnt ihr mir hier weiterhelfen?

    Anbei der Code. Die Klasse besteht nur aus dem Header, es gibt keine weitere Implementierungsdatei!

    Beim std::out im Konstruktor geben this und &rectangle immer die gleiche Adresse aus. Das kann doch nicht gutgehen?!

    #ifndef RECTANGLE_H
    #define RECTANGLE_H
    
    #include <iostream>
    
    #include <graphics/gfx.h>
    
    class RectangleC
    {
        private:
    	     struct Rectangle rectangle;
    	     int width, height;
    
        public:
            RectangleC(const int top = 0, const int left = 0, const int right = 0, const int bottom = 0) : width(right - left + 1), height(bottom - top + 1)
            {
            	rectangle.MinX = left;
    			rectangle.MinY = top;
    			rectangle.MaxX = right;
    			rectangle.MaxY = bottom;
    std::cout << "Erzeuge Rechteck " << this << " mit rectangle struct: " << &rectangle << " und top: " << top << " left: " << left << " right: " << right << " bottom: " << bottom << std::endl;
    		}
    
    		~RectangleC()
    		{
    std::cout << "Zerstöre Rechteck " << this << " mit rectangle struct: " << &rectangle << std::endl;
    		}
    
    		inline int getTop() const { return rectangle.MinY; }
    		inline int getLeft() const { return rectangle.MinX; }
    		inline int getBottom() const { return rectangle.MaxY; }
    		inline int getRight() const { return rectangle.MaxX; }
    		inline int getWidth() const { return width; }
    		inline int getHeigth() const { return height; }
    
    		inline const struct Rectangle * const getRectangleStruct() const { return &rectangle; }
    };
    #endif
    

    Vielen Dank schon mal!

    Ciao



  • Reth schrieb:

    Hallo zusammen,
    bin gerade auf Fehlersuche in meinem Programm und dabei an einer Stelle angekommen, bei der ich eine Klasse komplett nur im Header deklariert und definiert habe.

    Das ist ok.

    Reth schrieb:

    Leider beschäftige ich mich nur sehr selten mit C++ und bin mir daher nicht mehr 100% sicher, was dies Ganze bewirkt? Soweit ich weiss, werden für inline-Funktionen überall im Code Kopien angelegt.

    Jo, macht der Compiler aber auch heimlich, wenn er Lust dazu hat mit anderen Funktionen oder ruft die im Header definierten Funktionen doch auf, ganz, wie es ihm beliebt.

    Reth schrieb:

    Wie ist das aber mit einer vollständigen Klasse, wenn man Objekte davon an anderer Stelle erzeugt?

    Keine Auswirkung.

    Reth schrieb:

    Bei meiner Klasse verhält es sich seltsamerweise so, dass die Adresse eines Objektes dieser Klasse auch immer identisch ist mit der Adresse eines Klassenmembers (hier struct Rectangle)! Sowas darf doch gar nicht sein, oder?

    Logo! Die Adresse des ersten Elements ist normalerweise gleich der Adresse des Objekts.

    Mal angenommen
    struct S {int a;int b; int c;}; S s;//sizeof(int)==4
    Und &s sei 1000. Dann liegen dort 12 Bytes, also s geht von 1000 bis 1011.
    s.a geht von 1000-1003, s.b geht von 1004-1007 und s.c geht von 1008-1011.



  • Danke. Dann hab ich wohl an anderer Stelle noch ein Problem bei mir im Code.



  • Dann doch noch eine Frage: Wird von solch einer Klasse zur Laufzeit dann nur eine Instanz angelegt (ähnlich wie ein statisches Objekt) oder überall unterschiedliche Objekte?



  • Reth schrieb:

    Dann doch noch eine Frage: Wird von solch einer Klasse zur Laufzeit dann nur eine Instanz angelegt (ähnlich wie ein statisches Objekt) oder überall unterschiedliche Objekte?

    Da würde ich nochmal drüber nachdenken 😃

    Eigentlich macht Inline das genaue Gegenteil 😉


Log in to reply