Warnung: inline-Funktion »void spieler::write_name()« verwendet, aber nirgendwo definiert [standardmäßig aktiviert]|



  • Der mist ist doch definiert in der cpp 😮
    Ich kann das Problem von Code::Blocks null nachvollziehen 😞

    main.cpp

    #include <iostream>
    #include <string>
    #include "spieler.h"
    using namespace std;
    
    int main()
    {
        spieler nam;
    
        nam.write_name();
        cout << nam.get_name() << endl;
    
        return 0;
    }
    

    spieler.h

    #ifndef SPIELER_H_INCLUDED
    #define SPIELER_H_INCLUDED
    
    #include <string>
    using namespace std;
    
    class spieler{
    private:
        string name;
        unsigned long punkte;
    public:
    
        spieler();
        ~spieler();
    
        string get_name()const {return name;};
        unsigned long get_punkte()const {return punkte;};
        inline void write_name();
    
    };
    #endif // SPIELER_H_INCLUDED
    

    spieler.cpp

    #include "spieler.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    spieler::spieler(){
        cout << "konstruktor" << endl;
        punkte = 0;
        name = "";
    }
    
    spieler::~spieler(){
        cout << "destruktor" << endl;
    }
    
    inline void spieler::write_name(){
        getline(cin,name);
    }
    


  • Das ist eine andere Funktion. Musst sie im Header definieren.



  • Mechanics schrieb:

    Das ist eine andere Funktion. Musst sie im Header definieren.

    Also, wenn ich es richtig verstanden habe dürfen inline funktionen nur im Header definiert werden 😮 und das, weil Inline selber auch eine Funktion sind.

    Funktionieren tut es jetzt zumindest danke 👍



  • igel schrieb:

    Also, wenn ich es richtig verstanden habe dürfen inline funktionen nur im Header definiert werden 😮 und das, weil Inline selber auch eine Funktion sind.

    Die Definition einer inline Funktion muss überall bekannt sein, wo sie verwendet wird, genau das ist, was inline sagt. Wenn du deine Funktion in einem Header nur deklarierst, überall verwendest und aber nur an einer Stelle definierst, kannt sie nicht inline sein, das steht im Widerspruch zu Bedeutung von inline...



  • lass das "inline" weg. Der Compiler macht das automatisch, wenn er denkt, dasss es vorteilhaft ist. Wenn nicht, dann wird der Aufruf auch nicht "geinlined", selbst wenn du inline dazuschreibst. Das ist lediglich eine "Empfehlung" an den Compiler, kein "Befehl".



  • ohne gewähr:

    funktionen und methoden die im header >definiert< werden, werden alle schon als inline vorgeschlagen (so wie man es mit dem schlüsselwort explizit machen würde). aber wie daddy_felix schon sagte, machen das alle heutigen compiler sowieso für sich selbst auch ohne dass man etwas angibt. inline ist - zusammen mit auto (das aus <= c++03), register , export und typeid - ziemlich nutzlos.



  • asfdlol schrieb:

    ohne gewähr:

    funktionen und methoden die im header >definiert< werden, werden alle schon als inline vorgeschlagen

    Nein. Alle Funtionen, die innerhalb der Klassendefinition definiert werden, sind automatisch inline. Alle anderen Funktionen müssen explizit inline deklariert werden, wenn sie in einem Header stehen, da ansonsten die Funktion mehrfach definiert ist und der Linker dies als Fehler meldet (wenn der Header mehrmals benutzt wird).

    Inline hat keine Bedeutung für das eigentliche inlining zum Optimieren, es wird aber immer noch benötigt, um doppelte Funktionsdefinitionen zu verhindern.


Anmelden zum Antworten