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.
-
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?!
-
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 calledSagt dir das mehr?
-
Dann werf ich mal meine Kristallkugel an:
... init ...
Der KonstruktorMeth::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 KonstruktorMeth::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.)
-
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