Inline Methoden



  • Hallo Leute,
    ich stehe vor einer kleinen missverständlichen Hürde.

    Es geht um inline Methoden innerhalb von Klassen. Und zwar steht das in vielen Büchern mal so mal so. Mein Ziel ist es die Deklaration innerhalb der Headerdatei zu packen und dort die Prototypen mit dem inline Schlüsselwort zu versehen und die Definitionen in einer Cpp-Datei. Ist das so richtig und muss man in den Definitionen das Schlüsselwort auch nochmal anführen?

    Die Lösung wie ich sie Gedenke zu machen steht nirgendwo aber ich finde es viel übersichtlicher wenn alles schön in der Headerdatei zu lesen ist anstatt die Definitionen durchwühlen zu müssen.

    Freue mich über eure Hilfe.

    Gruß

    0xAFFE



  • Und zwar steht das in vielen Büchern mal so mal so.

    Jo, in den schlechten steht das einmal so, in den guten steht das so.

    Mein Ziel ist es die Deklaration innerhalb der Headerdatei zu packen und dort die Prototypen mit dem inline Schlüsselwort zu versehen und die Definitionen in einer Cpp-Datei.

    Redest du gerade von freien Funktionen oder Memberfunktionen?

    ich finde es viel übersichtlicher wenn alles schön in der Headerdatei zu lesen ist anstatt die Definitionen durchwühlen zu müssen.

    Das wird sich schnell ändern, sobald du größere Projekte hast in denen du die Definitionen der Funktionen oft ändern musst 😉



  • inline ist ein Schlüsselwort dass die one-definition-rule "ausschaltet". Es macht also keinen Sinn eine Funktion im Header als inline zu deklarieren und sie dann in einer .cpp Datei zu definieren, weil man dann die one-definition-rule eh nicht verletzt. Ob eine Funktion geinlined wird oder nicht, damit hat das ganze weniger zu tun. Die meisten Compiler ignorieren das Schlüsselwort einfach in dieser Hinsicht.



  • Also ich rede tatsächlich von den Klassenmethoden.

    Mein Beispiel:

    // Ort.h
    class Ort
    {
    private:
    	// Attribute
    	int xKoordinate; 
    	int yKoordinate;
    
    public:
    	// Zugriffsmethoden
    	inline int getXKoordinate(void) const;
    	inline int getYKoordinate(void) const;
    
    	inline void setXKoordinate(int);
    	inline void setYKoordinate(int);
    };
    
    // Ort.cpp
    #include "Ort.h"
    
    int Ort::getXKoordinate(void) const
    {
    	return xKoordinate;
    }
    
    int Ort::getYKoordinate(void) const
    {
    	return yKoordinate;
    }
    
    void Ort::setXKoordinate(int x)
    {
    	xKoordinate = x;
    }
    
    void Ort::setYKoordinate(int y)
    {
    	yKoordinate = y;
    }
    

    Also so hatte ich mir das gedacht. In dem Buch der C++ Programmierer gab es zwei Möglichkeiten. Einmal die Methoden gleich mitzudefinieren in der Headerdatei. Die andere war ebenfalls komplett in der Headerdatei aber dort wurden die Prototypen innerhalb der Klasse deklariert ohne Schlüsselwort und weiter unten außerhalb der Klasse die Definitionen die das Schlüsselwort bekamen.


  • Mod

    @cookie: Es macht also keinen Sinn eine Funktion im Header als inline zu deklarieren und sie dann in einer .cpp Datei zu definieren, weil man dann die one-definition-rule (fast) garantiert verletzt.

    Edit: ok, technisch ist es keine Verletzung der ODR, sondern einer anderen Regel.

    n3337 7.1.2/4 schrieb:

    An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case.

    (und die ODR sagt, was genau "exactly the same definition" bedeuten soll).



  • 0xAFFE schrieb:

    Also ich rede tatsächlich von den Klassenmethoden.

    Mein Beispiel:

    // Ort.h
    class Ort
    {
    private:
    	// Attribute
    	int xKoordinate; 
    	int yKoordinate;
    
    public:
    	// Zugriffsmethoden
    	inline int getXKoordinate(void) const;
    	inline int getYKoordinate(void) const;
    
    	inline void setXKoordinate(int);
    	inline void setYKoordinate(int);
    };
    
    // Ort.cpp
    #include "Ort.h"
    
    int Ort::getXKoordinate(void) const
    {
    	return xKoordinate;
    }
    
    int Ort::getYKoordinate(void) const
    {
    	return yKoordinate;
    }
    
    void Ort::setXKoordinate(int x)
    {
    	xKoordinate = x;
    }
    
    void Ort::setYKoordinate(int y)
    {
    	yKoordinate = y;
    }
    

    Also so hatte ich mir das gedacht. In dem Buch der C++ Programmierer gab es zwei Möglichkeiten. Einmal die Methoden gleich mitzudefinieren in der Headerdatei. Die andere war ebenfalls komplett in der Headerdatei aber dort wurden die Prototypen innerhalb der Klasse deklariert ohne Schlüsselwort und weiter unten außerhalb der Klasse die Definitionen die das Schlüsselwort bekamen.

    Jo, ist gut.
    Mach nur das inline weg, der Compiler tut das eh.


  • Mod

    Ich würde stattdessen vorschlagen, die trivialen Einzeiler tatsächlich inline zu machen, inklusive Definition im Header. Genau dazu ist inline da, damit wir hier dem Compiler die Optimierung besonders einfach machen können.



  • SeppJ schrieb:

    Ich würde stattdessen vorschlagen, die trivialen Einzeiler tatsächlich inline zu machen, inklusive Definition im Header.

    Dann kann man das inline aber weglassen, da implizit.

    Ich würde ja vorschlagen, die Member public zu machen, oder zumindest so zu schreiben:

    int& x() { return x; }
    int const& x() const { return x; }
    

Anmelden zum Antworten