Überprüfen auf Null Pointer



  • myA ist kein Zeiger, sondern ein Objekt vom Typ A.



  • Ja komme von Java.

    Nagut A ist kein Zeiger.
    Aber wie überprüfe ich, ob das Objekt A existiert?



  • Es existiert.



  • Das brauchst Du nicht zu überprüfen, Du hast es doch gerade selbst erstellt, wie schon erwähnt wurde!
    Das wäre, als wenn Du:

    int a = 5;
    if(a == 5)
    {
       ...
    

    machen würdest.



  • Ja natürlich exisitert es grad in diesem Beispiel.
    Das ist mir schon klar. Das Beispiel dient ja auch erstmal nur der
    Vereinfachung. Aber was wenn das Objekt nicht existieren würde.

    Anders ausgedrückt:
    Ich habe ein Array welches 10 Objekte der Klasse A aufnehmen kann.
    In dem Array habe ich drei Objekte der Klasse A abgelegt.
    Nun möchte ich, dass das Array komplett durchlaufen wird und mir
    an jeder Arraystelle ausgegeben wird, ob ein Objekt der Klasse A
    dort abgelegt ist oder nicht.
    Wie würde man das als C++ Programmierer lösen?

    int laenge = 10;
    A* myArray = new A[laenge];
    
    A a1;
    A a2;
    A a3;
    
    myArray[4] = a1;
    myArray[7] = a2;
    myArray[8] = a3;
    
    for(int i = 0; i < laenge; i++)
    {
          if(myArray[i] == 0) //Wie kann ich überprüfen, ob an der Arraystelle mit dem Index i ein Objekt der Klasse A vorhanden ist?
          {
    	   cout << endl << "Bei Index: " << i << "ist kein Element eingefügt";
          }
          else
          {
    	   cout << endl << "Bei Index: " << i << "ist ein Element vorhanden";
          }
    }
    


  • blupblup schrieb:

    Nun möchte ich, dass das Array komplett durchlaufen wird und mir an jeder Arraystelle ausgegeben wird, ob ein Objekt der Klasse A
    dort abgelegt ist oder nicht.

    Da du ein Array mit 10 Elementen vom Typ A angelegt hast, befindet sich dementsprechend auch an jeder Stelle ein A-Objekt.

    blupblup schrieb:

    Wie würde man das als C++ Programmierer lösen?

    Wenn man eine dynamische Anzahl Objekte verwalten möchte, dann nimmt man ebenso wie in Java keine Arrays, sondern std::vector (=ArrayList) oder andere Container.



  • Wenn ich allerdings keine dynamische Anzahl an Objekten verwalten, sondern
    ein Parkplatz fester größe simulieren will.
    Der Parkplatz soll eine feste größe von 10 Plätzen haben.
    Ein Auto kann auf jedem beliebigen freien Platz parken.
    Die Autos müssen sich nicht alle direkt nebeneinander anreihen.
    Wie in der Realität auch kann das erste Auto den Parkplatz Nr.4 belegen
    und das zweite Auto den Parpklatz Nr. 9.

    Stellt man sich nun vor, dass das Array A die Parplätze symbolisiert und
    die Objekte der Klasse A die Autos,so wäre der zuletzt von mir gepostete Code,
    die Abbildung dieser Aufgabe.

    Ein Vektor wäre an dieser Stelle ja nicht Hilfreich um genau diese Aufgabe zu lösen. Denn mit einem Vektor würde ich sagen ich kann meinen Parkplatzt jeder Zeit ausbauen falls mir Parkplätze fehlen. Dies ist aber nicht, dass was ich abbilden möchte. Außer ich missverstehe dich grad und du willst sagen, dass es
    womöglich eine Methode myVektor.at(i) oder ähnliches gibt, die mir sagt,
    ob an der Indexstelle i noch kein Element eingefügt ist und dass es noch eine Methode myVektor.insert(myObject, i) gibt mit der ich ein Objekt an eine bestimmte Stelle im Vektor einfügen und auch noch löschen kann.

    In Java würde ich diese Aufgabenstellung ohne Vektoren lösen. Dazu wäre eine normales Array schon ideal.



  • Java behandelt alle Klassentypen als Pointer. In C++ wird aber alles gleich behandelt. Also wie ints und doubles in Java. Wenn du ein Array mit 100 ints erstellst, überprüfst du ja auch nicht, wo sich in dem Array ints befinden. Wenn du Pointer willst, musst du das in C++ auch explizit so sagen. (So kannst du allerdings auch Problemlos einen Pointer auf int erstellen.)



  • cooky451 schrieb:

    Wenn du ein Array mit 100 ints erstellst, überprüfst du ja auch nicht, wo sich in dem Array ints befinden.

    Ob ich es übeprüfe oder nicht überprüfe, wo sich in einem Array ints befinden hängt ja davon ab was ich programmtechnisch abbilden möchte.

    In dem Beispiel mit dem Parkplatz ist es ja gewollt zu wissen, welcher Parkplatz
    frei ist und welcher belegt. Ein neu ankommendes Auto muss ja wissen, wo es
    parken kann. Und in der Realität parken die Autos auf einem Parkplatz nicht alle
    immer direkt nebeneinander, sondern beliebig verteilt.

    Angenommen du hättest als Aufgabe eine Software zu entwickeln, die es erlaubt einem Parkwächter auf seinem Computer zu überprüfen, welche Parkplätze noch frei sind, damit falls jemand einparken will, er ihn direkt dahin lotsen kann. Zudem soll er anschließen das Auto in seinem Computer "einchecken" können und wieder "auschecken" können. Dazu ist es nunmal erforderlich zu überprüfen, wo sich in dem Array Autos [oder bei deiner Aussage ints] befinden.

    Ich verwende von mir aus auch gerne Pointer, wenn mich das irgendwie ein Stückchen näher an die Lösung bringt, da verschließe ich mich ja gar nicht.
    Aber auch mit Pointern, weiß ich immer noch nicht wie ich die Überprüfung mache, ob sich ein Element an einer bestimmten Stelle im Array befindet oder nicht. Wenn jemand mir ein Beispielcode dafür zeigen würde, wäre das für mich sehr hilfreich, aber momentan seh ich noch keine Lösung.



  • Das ist ziemlich einfach:

    if (my_poiner == nullptr)
      ...
    


  • Sein oder nicht sein, das ist hier die Frage!
    Wenn ein Objekt sein kann oder auch nicht, dann verwende einen Zeiger, zum Beispiel einen einzigartig_zgr. Den kannst Du dann genau wie in Java fragen, ob er etwas zu berichten hat.
    Manchmal frage ich mich, ob die Objekte an einen Programmierer glauben, oder eher agnostisch veranlagt sind. Kommt bestimmt auf die Schnittstelle an.



  • Das Problem ist: Du modellierst die Dinge falsch. Eine Reihe von Parkplätzen ist keine Sammlung von Autos, entsprechend ist ein Auto-Array unangebracht. Wie du selbst sagst, kann ein Parkplatz leer sein. Ein Element eines Arrays kann aber nicht leer sein.

    Du musst vom Java-Denken wegkommen. Wenn du in C++ ein Objekt definierst, ist es tatsächlich ein Objekt und keine Referenz. Du kannst es nicht an seiner Existenz hindern.

    Zu den Zeigern: Du schaust, ob eine bestimmte Stelle im Array ein Nullzeiger ( nullptr ) ist. Falls ja, ist der entsprechende Parkplatz leer. Ansonsten hast du einen Zeiger auf ein Auto, bei dessen Dereferenzierung du auf das Auto zugreifen kannst. Schau dir Zeiger unbedingt im Detail an, das ist ein fundamental wichtiges Konzept in C++. Und vergiss dabei Java, da laufen die Dinge anders.



  • Nexus schrieb:

    ...
    Du musst vom Java-Denken wegkommen. Wenn du in C++ ein Objekt definierst, ist es tatsächlich ein Objekt und keine Referenz. Du kannst es nicht an seiner Existenz hindern.
    ...

    Das wollen wir doch aber nochmal sehen! *Mit der Memset-Raupe heranfahr*



  • Nexus schrieb:

    Und vergiss dabei Java, da laufen die Dinge anders.

    Eigentlich nicht. Eigentlich sollte jeder der Java kann, Zeiger innerhalb von Sekunden verstehen, schließlich hantiert man ja den ganzen Tag damit. 🙂



  • Das Problem ist, wenn du ein Array von 10 A-Objekten erstellt, wird anhand des Standardkonstruktors an jeder Position ein A-Objekt erstellt, was dann auch existiert!
    Du musst Pointer in diesem Fall verwenden.



  • cooky451 schrieb:

    Eigentlich sollte jeder der Java kann, Zeiger innerhalb von Sekunden verstehen, schließlich hantiert man ja den ganzen Tag damit. 🙂

    Nur sehr eingeschränkt. Konzepte wie Adresse, Dereferenzierung, Zeigerarithmetik oder Speicherverwaltung sind in C++ neu.



  • Man könnte zb boost::optional verwenden.

    #include <boost/optional.hpp>
    #include <iostream>
    
    int main()
    {
        boost::optional<int> array[10];
        array[1] = 5;
        array[5] = 7;
    
        for(int i = 0; i < 10; ++i)
        {
            if(array[i])
            {
                std::cout << "Element " << i << "existiert!\n";
            }
        }
    }
    

Anmelden zum Antworten