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



  • 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