Erzeugen von Objekten über Methode einer anderen Klasse und Pointerrückgabe



  • struct World{
    	std::vector<std::unique_ptr<Block>> blocklist;
    };
    
    int main(){
    	World world;
    	//world erzeuge block mit diesen parametern
    	world.blocklist.push_back(std::make_unique<Block>(8, 15));
    	//world sag mir deine parameter
    	for (const auto &b : world.blocklist)
    		std::cout << b->xposition << b->yposition;
    }
    


  • Hallo nochmal,

    ich werde nun wohl meine Implementation ganz über den Haufen werfen und nochmal anders herangehen. Danke für eure Hinweise, sie haben mich ein Stück aus der Sackgasse geholt.



  • SeppJ schrieb:

    In C++ hat man nur sehr selten überhaupt Pointer

    dann zeig' mir mal, wie du Qt in C++ ohne Pointer programmierst.

    SeppJ schrieb:

    Leute sagen zwar immer, C++ hätte Pointer drin, aber das sind die Leute, die kein C++ können (oder C++ für C halten).

    Satire bitte kennzeichnen. Oder meinst Du das etwa ernst ?

    Daß man ohne irgendeine Art Referenzen in C++ nicht auskommt, wirst Du wohl nicht bestreiten. Referenzen können Pointer oder eben references sein (unglückliche Bezeichnung in C++, da reference auch einen Oberbegriff meint, der Zeiger und Referenzen einschließt).

    Erstens kann eine Referenz intern durch einen Pointer realisiert sein (Maschinencode: indirekte Adressierung). Da haben wir also intern eventuell Pointer, die bei Verwendung implizit dereferenziert werden.

    Zweitens ist eine Referenz semantisch nicht das gleiche wie ein Zeiger. Referenzen lassen sich nicht nachträglich auf andere Objekte umleiten, müssen unmittelbar initialisiert werden, sind != 0 usw. Benötigt man aber genau solche Eigenschaften, braucht man ... na eben, Pointer.



  • großbuchstaben schrieb:

    Referenzen können Pointer oder eben references sein (unglückliche Bezeichnung in C++, da reference auch einen Oberbegriff meint, der Zeiger und Referenzen einschließt).

    Der Begriff Referenz ist in C++ ziemlich klar definiert als das, was du mit & deklarierst. Als Oberbegriff würde ich vielleicht eher "Verweis" oder "Indirektion" nehmen (auf Englisch wirds schwieriger, aber "reference" ist auch dort klar definiert).

    großbuchstaben schrieb:

    Erstens kann eine Referenz intern durch einen Pointer realisiert sein (Maschinencode: indirekte Adressierung). Da haben wir also intern eventuell Pointer, die bei Verwendung implizit dereferenziert werden.

    Ja, aber das ist ein Implementierungsdetail. Man benutzt deswegen keine Zeiger.

    großbuchstaben schrieb:

    Benötigt man aber genau solche Eigenschaften, braucht man ... na eben, Pointer.

    Da stimme ich völlig zu, auch in C++ sind Zeiger immer wieder anzutreffen. Zwar etwas seltener als in C, aber sie haben diverse Anwendungsbereiche. Ich denke, SeppJ hat das etwas überspitzt formuliert, weil es tatsächlich nicht wenige Leute gibt, die C in C++ programmieren. Wirklich schlimm wird es, wenn man dauernd mit rohen Zeigern Speicher verwaltet -- daran erkennt man relativ schnell, wer C++ verstanden hat.



  • Nexus schrieb:

    Der Begriff Referenz ist in C++ ziemlich klar definiert als das, was du mit & deklarierst. Als Oberbegriff würde ich vielleicht eher "Verweis" oder "Indirektion" nehmen (auf Englisch wirds schwieriger, aber "reference" ist auch dort klar definiert).

    eine C++-"reference" (&) ist ein Speziallfall des allgemeinen Begriffs "reference", der seinerseits viel älter ist als C++. Ein C++-"pointer" ist ein anderer Spezialfall.

    Generationen von Informatikstudenten lernen, was ein "call-by-reference" ist, in C++ aber kann ein "call-by-reference" sowohl einen C++-pointer als auch eine C++-reference meinen. Eine etwas unglückliche Wahl der Bezeichnung, würde ich meinen. Warum nicht "implicit pointer", "transparent pointer", "fixed pointer", "pointer-alias" oder irgendetwas Anderes anstelle von "reference".

    Nexus schrieb:

    Ja, aber das ist ein Implementierungsdetail. Man benutzt deswegen keine Zeiger.

    dann schau' Dir mal an, was der Compiler aus einer Referenz macht, und was er aus einem Zeiger macht. Stichwort indirekte Adressierung (auf CPU-Ebene).



  • großbuchstaben schrieb:

    Nexus schrieb:

    Ja, aber das ist ein Implementierungsdetail. Man benutzt deswegen keine Zeiger.

    dann schau' Dir mal an, was der Compiler aus einer Referenz macht, und was er aus einem Zeiger macht. Stichwort indirekte Adressierung (auf CPU-Ebene).

    Ihr diskutiert komplett aneinander vorbei.
    Nexus (und SeppJ) reden von der Ebene der Programmiersprache C++ und den abstrakten Konzepten Zeiger und Referenz.
    Du redest von der Implementierung auf Hardwareebene.
    Auf der Ebene von C++ ist eine Referenz eine Referenz und hat nichts mit einem Pointer zu tun. Auf deiner Ebene ist eine Referenz ein Pointer, nichtsdestotrotz verwendet man als Programmierer keinen Pointer, sondern eine Referenz.
    Und ich muss SeppJ definitiv zustimmen, rohe (besitzende) Pointer nutzt man in C++ wenn überhaupt nur stark abgekapselt.



  • Nathan schrieb:

    Ihr diskutiert komplett aneinander vorbei.

    glaube ich nicht. Die Behauptung war:

    Leute sagen zwar immer, C++ hätte Pointer drin, aber das sind die Leute, die kein C++ können (oder C++ für C halten).

    ich halte dies für Mumpitz.

    Nathan schrieb:

    Und ich muss SeppJ definitiv zustimmen, rohe (besitzende) Pointer nutzt man in C++ wenn überhaupt nur stark abgekapselt.

    wo hat seppj das gesagt?

    außerdem warte ich noch immer auf jemanden von der no-pointer-Fraktion, der mir erklärt, wie man Qt in C++ ohne pointer programmiert.

    Ich bin übrigens sehr dafür, C++ als eigenständige Sprache zu betrachten und sich meinetwegen lieber heute als morgen von C-"Altlasten" zu trennen, aber pointer sind nunmal kaum verzichtbar in einer Sprache mit vollem Hardwarezugriff.

    Das ändert sich auch nicht dadurch, daß man "pointer" mit gewissen syntaktischen und semantischen Unterschieden zu "references" macht. CPU-nahe Dinge wie pointer und I/O-Register direkt programmieren zu können ist eine der großen Stärken von C++, warum also die Bedeutung von Pointern verleugnen?



  • großbuchstaben schrieb:

    Generationen von Informatikstudenten lernen, was ein "call-by-reference" ist

    Und was haben diese Generationen von Informatikstudenden gelernt?
    Doch wohl, dass bei einem call-by-ref der Wert nicht kopiert wird, sondern Änderungen auch nach Ende der Funktion erhalten bleiben.
    Und genau das macht C++.
    In Pointer ist kein Call-by-ref (nebenbei genauso wenig, wie eine struct mit Pointern, die als Value übergeben wird, wäre nach deiner Argumentation ja dann auch call-by-ref).
    Einen Pointer kannst du als Refenence übergeben, aber ein Pointer als Value übergeben ist sicherlich kein Call-By-Ref.
    Neulich hatten wir die Diskussion im Java-Forum, weil da die Bezeichnung wirklich nicht ganz eindeutig ist (auch nach deiner Argumentation).
    Hier ist sie aber wohl so klar, wie sie klarer nicht sein kann.



  • großbuchstaben schrieb:

    Leute sagen zwar immer, C++ hätte Pointer drin, aber das sind die Leute, die kein C++ können (oder C++ für C halten).

    ich halte dies für Mumpitz.

    Wie gesagt, er redet vom Konzept "Pointer" in C++.
    Ein "Pointer" ist eine Variable die eine Adresse speichert und man auf den Wert, der an dieser Adresse steht zugreifen kann. Diese "Pointer" sind allerdings sehr fehleranfällig. Diese Fehler kann man mithilfe C++ Techniken vermeiden, weswegen man "Pointer" in C++ nur abgekapselt verwenden sollte.

    Nathan schrieb:

    Und ich muss SeppJ definitiv zustimmen, rohe (besitzende) Pointer nutzt man in C++ wenn überhaupt nur stark abgekapselt.

    wo hat seppj das gesagt?

    Mein Satz war so zu verstehen:

    Und ich muss SeppJ definitiv zustimmen.
    Rohe (besitzende) Pointer nutzt man in C++ wenn überhaupt nur stark abgekapselt.

    außerdem warte ich noch immer auf jemanden von der no-pointer-Fraktion, der mir erklärt, wie man Qt in C++ ohne pointer programmiert.

    Natürlich braucht man Referenzen (jetzt der Informatik, nicht der C++ Term) auf andere Objekte. Diese Referenzen sollten aber nicht rohe "Pointer" sein, sondern etwas besseres, z.B. "Smart Pointer" oder Handles.
    Und ich kenn Qt nicht, worauf spielst du an?

    Ich bin übrigens sehr dafür, C++ als eigenständige Sprache zu betrachten und sich meinetwegen lieber heute als morgen von C-"Altlasten" zu trennen, aber pointer sind nunmal kaum verzichtbar in einer Sprache mit vollem Hardwarezugriff.

    Ja, mit "Pointern" kann man viel mächtiges machen.

    Das ändert sich auch nicht dadurch, daß man "pointer" mit gewissen syntaktischen und semantischen Unterschieden zu "references" macht. CPU-nahe Dinge wie pointer und I/O-Register direkt programmieren zu können ist eine der großen Stärken von C++, warum also die Bedeutung von Pointern verleugnen?

    Wie gesagt, wir verleugnen nicht Pointer, sondern "Pointer".



  • großbuchstaben schrieb:

    Generationen von Informatikstudenten lernen, was ein "call-by-reference" ist, in C++ aber kann ein "call-by-reference" sowohl einen C++-pointer als auch eine C++-reference meinen.

    In Java hast du bis auf Basistypen nur Referenzen, aber nie Call by Reference.

    In C++ macht die strikte Trennung von Call-by-Value/Reference nur Sinn, wenn man Pointer-Übergabe als Call-by-Value interpretiert. Zeiger sind Objekte, Referenzen nicht.

    großbuchstaben schrieb:

    Eine etwas unglückliche Wahl der Bezeichnung, würde ich meinen. Warum nicht "implicit pointer", "transparent pointer", "fixed pointer", "pointer-alias" oder irgendetwas Anderes anstelle von "reference".

    Weil ein Begriff, der "Pointer" enthält, alles komplizierter macht, mehr Leute verwirrt und ständig unnötig lange Erklärungen erfordert. Stell dir nur mal vor, wie gewisse Typedefs in Containern aussähen.

    Da wir uns im C++-Kontext befinden, ist der Begriff jedem klar. Ich hatte noch nie das Problem, dass jemand mit Kenntnis der Sprache "Referenz" nicht verstand. Informatikstudenten lernen ein einziges Mal die Bedeutung von C++-Referenzen und wissen es dann.

    Was hingegen ein echtes Problem ist, sind "konstante" bzw. "nicht-konstante Referenzen". Das machen extrem viele Leute falsch.

    großbuchstaben schrieb:

    dann schau' Dir mal an, was der Compiler aus einer Referenz macht, und was er aus einem Zeiger macht. Stichwort indirekte Adressierung (auf CPU-Ebene).

    Eben: Implementierungsdetail, das hat den Anwender nicht zu interessieren. Genauso wie es den Anwender nicht interessieren muss, dass eine Schleife auf Assemblerebene durch Sprunganweisungen realisiert wird.

    Hochsprachen existieren zur Abstraktion von der Hardware. Es schadet zwar nicht, die Hintergründe zu kennen, aber aus Benutzersicht sind sie meist irrelevant.



  • SeppJ schrieb:

    Leute sagen zwar immer, C++ hätte Pointer drin, aber das sind die Leute, die kein C++ können (oder C++ für C halten).

    LOL 🙂

    lies mal den vorletzten Satz in der Antwort auf die Frage "Should I use call-by-value or call-by-reference" in der C++ Style and Technique FAQ vom C++ - Erfinder.



  • großbuchstaben schrieb:

    SeppJ schrieb:

    Leute sagen zwar immer, C++ hätte Pointer drin, aber das sind die Leute, die kein C++ können (oder C++ für C halten).

    LOL 🙂

    lies mal den vorletzten Satz in der Antwort auf die Frage "Should I use call-by-value or call-by-reference" in der C++ Style and Technique FAQ vom C++ - Erfinder.

    Meinste den?

    Stroustrup schrieb:

    My personal style is to use a pointer when I want to modify an object because in some contexts that makes it easier to spot that a modification is possible.

    Der nutzt das nicht, weil er Pointer haben will, sondern aus syntaktischen Gründen:

    f(a); //wird a jetzt verändert?
    g(&a) // ah, a wird höchstwahrscheinlich verändert
    

    Das Argument find ich allerdings nicht ganz so toll, man muss sich eh für vieles die Funktionssignatur anschauen. Ob die Funktion jetzt bspw. noexcept ist oder eine const-Memberfunktion sieht man ja auch nicht im Aufruf.


Anmelden zum Antworten