Objekt erzeugen mit Referenz auf Zeiger auf ein anderes Objekt (call by reference)



  • Guten Morgen 🙂

    Ich hab folgendes Problem: Ich will ein Objekt als Pointer erzeugen (TestParse)

    und dann mit einer Referenz auf den Pointer ein Objekt (TestMeth) einer anderen Klasse (Meth) erzeugen, das irgendwas mit dem ersten Objekt (TestParse) macht.

    Parser.h

    class Parser {
    ...
    };
    

    Meth.h

    #include "Parser.h"
    // Constructor
    Meth(Parser &TestParse);
    

    main

    int main(int argc, char** argv){
    
       Parser *TestParse;
       TestParse = new Parser;
    
       TestParse->Funct1();
       TestParse->Funct2();
       // Bis hier wird kompiliert
    
       // An dieser Stelle tritt der erste Fehler auf
       // Objekt der Klasse Meth wird mit Referenz auf den Zeiger auf TestParse erzeugt
       Meth *TestMeth(Parser &TestParse);
       TestMeth(&TestParse) = new Meth;
    }
    

    Nun, wie ihr euch denken könnt, das funktioniert so nicht. Ich finde leider nichts dazu im Netz, oder zumindest kein Beispiel, das ich gut nachvollziehen könnte. Hat jemand nen Hint wo ich einen Denkfehler mache?

    VG, C.


  • Mod

    Meth *TestMeth(Parser &TestParse);
    

    Bevor du wilde Sachen mit Pointern und new versuchst (warum eigentlich? Ich sehe keinen Grund bei deinem Programm), solltest du nochmal auf Seite 1 deines C++-Buchs anfangen. Da wird dann auch erklärt wie man Funktionen aufruft.



  • Meth *TestMeth = new Meth(*TestParse);



  • @SeppJ: Wenn du meinen Post gelesen hast und immer noch Kritikpunkte hast, nehm ich die Kritik gern an.

    @Belli: Danke sehr 🙂 Ich bekomme noch folgende Fehlermeldung zurück:

    'Meth::Meth(const Meth &)' : cannot convert parameter 1 from 'Parser' to 'const Meth &'
    1> Reason: cannot convert from 'Parser' to 'const Meth'

    Der Konstruktor soll doch die übergebenen Parameter (bzw. Pointer/Referenzen) selbst konvertieren, oder nicht?



  • Cordula schrieb:

    'Meth::Meth(const Meth &)' : cannot convert parameter 1 from 'Parser' to 'const Meth &'
    1> Reason: cannot convert from 'Parser' to 'const Meth'

    Das muß aber doch von einer anderen Codestelle herrühren.

    Denn:

    Cordula schrieb:

    #include "Parser.h"
    // Constructor
    Meth(Parser &TestParse);
    

    einen Konstruktor, der eine Referenz auf ein Parser - Objekt entgegennimmt, hast Du doch?!


  • Mod

    Cordula schrieb:

    @SeppJ: Wenn du meinen Post gelesen hast und immer noch Kritikpunkte hast, nehm ich die Kritik gern an.

    😕 Genau auf den Inhalt deines Beitrags bezieht sich doch meine Kritik, dass du das ganze new und gepointere gar nicht brauchst. Oder deine Beschreibung ist derart gekürzt, dass dies nicht mehr offensichtlich ist. Die Forenerfahrung lehrt mich aber, dass viele Anfänger (und du bist einer, wie man an deinem Fehler sieht) und Java-Umsteiger sehr oft unnötigerweise new benutzen.



  • Nee, das ist genau die Zeile die ich korrigiert habe auf

    Meth *TestMeth = new Meth(*TestParse);
    

    Und die Fehlermedlung lautet komplett

    1> Reason: cannot convert from 'Parser' to 'const Meth'
    1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

    Sagt dir das mehr?



  • Dann werf ich mal meine Kristallkugel an:
    ... init ...
    Der Konstruktor Meth::Meth(Parser &TestParse) ist private.

    Und hör auf SeppJ und schmeiß die Zeiger und das new raus.



  • Michael E. schrieb:

    Dann werf ich mal meine Kristallkugel an:
    ... init ...
    Der Konstruktor Meth::Meth(Parser &TestParse) ist private.

    Das darf/dürfte natürlich nicht sein. Wenn Du den erwähnten Konstruktor frei zugänglich (public) deklariert hast, dann sollte

    Meth *TestMeth = new Meth(*TestParse);

    keine Probleme bereiten ....



  • Nee, es ist alles public. Aber ich versuch's selbst rauszukriegen, hoffentlich klappt's.

    Ich kann die Zeiger und das new nicht rausschmeißen, weil es keine Funktionsaufrufe sind, sondern das Erzeugen eines Objekts. Ich habe relativ große Klassen mit jeweils sinnverwandten Funktionen. In dem main will ich dann ein Objekt der ersten Klasse erzeugen, entsprechend dem InputFile verändern, und dann je nach Ergebnis die Methoden einer anderen Klasse darauf laufen lassen. Das Objekt der ersten Klasse als Zeiger zu erzeugen und dann der zweiten Klasse als Referenz auf diesen Zeiger zu übergeben für die Erzeugung des zweiten Objekts ist der einzige Weg der mir einigermaßen sinnvoll erscheint. Wenn jemand an dieser Stelle einen besseren Vorschlag hat - her damit 🙂



  • Cordula schrieb:

    Wenn jemand an dieser Stelle einen besseren Vorschlag hat - her damit 🙂

    Dein Konstruktor

    Meth::Meth(Parser &TestParse)

    nimmt ja nicht einen Zeiger oder eine Referenz auf einen Zeiger an, sondern eine Referenz auf ein Objekt vom Typ Parser.
    Dieses Objekt vom Typ Parser könnte also ganz normal als Stackobjekt erzeugt worden sein:

    ...
    Parser TestParse;
    ...
    Meth TestMet(TestParse);
    ...



  • Cordula schrieb:

    Wenn jemand an dieser Stelle einen besseren Vorschlag hat - her damit 🙂

    Schmeiß new und die Pointer raus. (Tipp: Wenn dir das so oft geraten wurde, solltest du dich schlau machen, ob du nicht Objekte ohne new und Pointer erzeugen kannst.)


  • Mod

    Cordula schrieb:

    Nee, es ist alles public. Aber ich versuch's selbst rauszukriegen, hoffentlich klappt's.

    Ich kann die Zeiger und das new nicht rausschmeißen, weil es keine Funktionsaufrufe sind, sondern das Erzeugen eines Objekts. Ich habe relativ große Klassen mit jeweils sinnverwandten Funktionen. In dem main will ich dann ein Objekt der ersten Klasse erzeugen, entsprechend dem InputFile verändern, und dann je nach Ergebnis die Methoden einer anderen Klasse darauf laufen lassen. Das Objekt der ersten Klasse als Zeiger zu erzeugen und dann der zweiten Klasse als Referenz auf diesen Zeiger zu übergeben für die Erzeugung des zweiten Objekts ist der einzige Weg der mir einigermaßen sinnvoll erscheint. Wenn jemand an dieser Stelle einen besseren Vorschlag hat - her damit 🙂

    Häh? Warum nicht so?

    class ErsteKlasse;
    
    class ZweiteKlasse
    {
     public:
     void Methode(ErsteKlasse &);
    }
    
    int main()
    {
     ErsteKlasse ObjektDerErstenKlasse;
    
     // ObjektDerErstenKlasse gemäß InputFile verändern.
    
     if (Ergebnis)
     {
       ZweiteKlasse ObjektDerZweitenKlasse;
       ObjektDerZweitenKlasse.Methode(ObjektDerErstenKlasse);
     }
    }
    


  • Das funktioniert super, danke 🙂


Anmelden zum Antworten