nullptr unter Linux



  • Hallo und Guten Abend,

    auch wenn es eine Menge Informationen zu dem Thema "nullptr" im Netz gibt, habe ich die Lösung noch nicht gefunden.

    Ich arbeite und programmiere seit kurzem unter Linux mittels Eclipse. Beim Programmieren von Klassen und Listenobjekten benötige ich denn Ausdruck "nullptr", und ich weiß nicht, wo ich den herzaubern kann. Ich habe nun schon so oft gelesen, man müsse einfach nur den entsprechenden "Standard" beim Compiler angeben und das wäre die Lösung. Eine dauerhafte Lösung soll angeblich in Arbeit sein, nur sind die Beiträge zu diesem Thema einige Jahre alt.

    Kann mir von euch jemand einen Tipp geben, wo da mein Fehler ist? Ich kann kaum glauben, dass es für dieses Problem keine vernünftige Lösung gibt 😞

    lg Torsten



  • Du kannst in den Compilersettings bzw. den Kompiliersettings angeben, mit welchen Optionen kompiliert werden soll. Da kannst du dann sowas anklicken wie std=c++11/c++1y/c++0x, zur not gibst dus ein. Google kann da nochwas helfen.



  • tormen schrieb:

    Ich arbeite und programmiere seit kurzem unter Linux mittels Eclipse. Beim Programmieren von Klassen und Listenobjekten benötige ich denn Ausdruck "nullptr"

    Das ist sehr, sehr unwahrscheinlich. Ich glaube nicht, dass du in einer Situation bist, in der du nullptr brauchst. Du brauchst vielleicht einen Nullzeiger, aber sowas gibts schon immer, während es das Schlüsselwort nullptr erst seit C++11 gibt.

    int *ptr = 0; // ein Nullzeiger
    

    Ausnahme: Du hast Code vorliegen, der in C++11 geschrieben ist. Dann musst du natürlich einen aktuellen (bzw. auf aktuell eingestellten) Compiler benutzen.



  • Hm...,

    also dann habe ich die Funktion des 'nullptr' offensichtlich nicht ganz verstanden. Ich dachte, ich kann ihn dafür nutzen, um einem Objekt zu sagen, dass es "nirgendwo" hinzeigen soll. Sprich, ich kann beispielsweise prüfen, ob ein Listenobjekt einen Nachfolger hat ober eben nicht?

    Beispiel :

    if (MeinObjekt->Nachfolger == nullptr)
    {
     kein Nachfolger vorhanden;
    } else
    {
     Nachfolger vorhanden;
    }
    

    Ist das also falsch?

    Danke Bashar für deinen Tipp. So schent es erstmal zu funktionieren.

    lg Torsten



  • Dafür braucht man weder nullptr noch 0:

    if (MeinObjekt->Nachfolger)
    {
     Nachfolger vorhanden;
    } 
    else
    {
     kein Nachfolger vorhanden;
    }
    


  • Ja manni66. Man kann darauf verzichten. Auf die geschweiften Klammern aber auch.

    Es gibt ein paar Situationen in denen die Zuweisung von 0 auf einen Pointer vielleicht schiefgehen kann, implizit typecasts sind da das Problem. Wegen dieser impliziten Typecast funktioniert auch das was manni66 so schön geschrieben hat. Weil dabei aus einem Pointer ein bool wird. Ist der Pointer 0 dann wird daraus ein false. In allen anderen Fällen true.

    nullptr ist eingeführt worden damit man, bei Konstruktoren zum Beispiel, auf den richtigen Konstruktor geleitet wird. nullptr ist eben nicht die Zahl 0 die durch implizite Typecasts konvertiert wird, sondern wirklich ein Pointer mit dem Wert 0.

    Deswegen braucht man ihn nicht zwingend aber es ist schon schick wenn man Eindeutigkeit in sein Programm bekommt. Schützt vor Überraschungen.



  • simbad schrieb:

    Es gibt ein paar Situationen in denen die Zuweisung von 0 auf einen Pointer vielleicht schiefgehen kann, implizit typecasts sind da das Problem.

    Es gibt keine Situation in die die Zuweisung eines Pointers auf 0 schief gehen kann!?

    nullptr ist eingeführt worden damit man, bei Konstruktoren zum Beispiel, auf den richtigen Konstruktor geleitet wird.

    Ja, aber das ist hier nicht das Problem.

    nullptr ist eben nicht die Zahl 0 die durch implizite Typecasts konvertiert wird, sondern wirklich ein Pointer mit dem Wert 0.

    Nein. nullptr zu Pointer ist wie 0 zu Pointer exakt dieselbe Konvertierung, nämlich eine null pointer conversion (§4.10/1).


  • Mod

    Nathan schrieb:

    simbad schrieb:

    Es gibt ein paar Situationen in denen die Zuweisung von 0 auf einen Pointer vielleicht schiefgehen kann, implizit typecasts sind da das Problem.

    Es gibt keine Situation in die die Zuweisung eines Pointers auf 0 schief gehen kann!?

    template<class T> class NotSoSmartPointer
    {
      T *ptr;
      // [...]
      NotSoSmartPointer& operator=(T* p) { ptr = p; return *this; }
      NotSoSmartPointer& operator=(int i) {/* Duh */ ; return *this; }
    };
    

    SCNR.

    🤡

    ~PS: Nicht, dass das jemand falsch versteht: Dass ist ein Scherz und nicht dazu gedacht, auf irgendwelche realen Gefahren bei Nullzuweisungen hinzuweisen.
    ~



  • SeppJ schrieb:

    Nathan schrieb:

    simbad schrieb:

    Es gibt ein paar Situationen in denen die Zuweisung von 0 auf einen Pointer vielleicht schiefgehen kann, implizit typecasts sind da das Problem.

    Es gibt keine Situation in die die Zuweisung eines Pointers auf 0 schief gehen kann!?

    SCNR.

    🤡

    Und genau aus diesem Grund vermeide ich normalerweise absolute Aussagen beim Posten. 😃


Log in to reply