aus einer Funktion Objekte als Zeiger an eine andere funktion übergeben...
-
es soll einfach ein Objekt aus einer Funktion zur anderen als ein Zeiger übergeben werden.. kriege es aber leider nicht hin
ohne Zeiger klappts ganz gut
#include <iostream.h> // - - - - - Klasse Counter // - - - - - class Counter { public: Counter(); ~Counter(); int getX() {cout << "GetX x \t\t" << x << endl; return *x; } void setX(int _x) {*x = _x;} private: int * x; }; Counter::Counter() { x = new int(0); cout << " Konstr. x \t" << x << endl; } Counter::~Counter() { delete x; x = 0; cout << "Destr." << endl; } // - - - - - Funktion _Main // - - - - - Counter _Main() { Counter *C = new Counter; cout << "_Main C \t" << C << endl; C->setX(5); cout << "\nCounter: " << C->getX() << endl<<endl; return *C; } // - - - - - Main Funktion // - - - - - int main() { Counter B = _Main(); cout << "Main B \t\t" << &B << endl; cout << "\nCounter: " << B.getX() << endl; cin.get(); return 0; }
Ausgabe:
Konstr. x 00844A8C
_Main C 00844A7C
GetX x 00844A8CCounter: 5
Main B 0012FF88
GetX x 00844A8CCounter: 5
das übliche bei Anfängern... wieder mal ein Zeiger Problem
1. es funktioniert nicht wirklich.. den wenn ich versuche das "C" Objekt als Zeiger zu übergeben ..aus der _Main Funktion an Main zu übergeben geht nichts.. was mach ich Flasch
Bsp.Counter _Main() { Counter *C = new Counter; cout << "_Main C \t" << C << endl; C->setX(5); cout << "\nCounter: " << C->getX() << endl<<endl; return C; // so sollte es doch gehen?? } // - - - - - Main Funktion // - - - - - int main() { Counter *B = _Main(); // so sollte es doch gehen?? cout << "Main B \t\t" << &B << endl; cout << "\nCounter: " << B.getX() << endl; cin.get(); return 0; }
oder wie bewerkstelligt man das?
wer man aus der Ausgabe sehen kann wir x des Objektes "C" als Zeiger an das x von "B" übergeben2.was befindet sich in dem Speicher von "B" oder "C"
ich habe gedacht das der speicher eines Objektes aus seinen Elementdateien zusammengesetz wird
das scheint jedoch nicht so zu sein..das ganze Progamm sollte so aussehen:
_Main Funktion erzeugt das Objekt auf dem Heap und reserviert ebenfalls Speicher für seine Elementvariable x
anschließend wird das ganze Objekt mit seiner Elementvariable als Zeiger an Main übergeben..
in Main sollte man damit ganz normal Arbeiten können .. wenn man dort den Speicher des Objektes betrachtet sollte man genau den selben Speicherbereich sehen wie in _Main
am Ende soll dann der Destruktor in Main aufgerufen werden um das Objekt zu zerstören und den Speicher wieder frei zu geben^^ wie mach ich das richtig?
und macht man das in C überhaupt so?MFG insane
-
Deine _Main (leading _ ist übrigens eigentlidch für Compiler/Implementierer der Standardlib reserviert) hat als Rückgabewert Counter. Das heißt, Du mußt ein Objekt zurückgeben. Willst Du den Zeiger zurückgeben, dann mußt Du den Rückgabewert in Counter * umändern.
MfG Jester
-
wenn wir schon mal dabei sind... das Programm krieg ich auch nicht zum laufen
es erscheint immer folgender Fehler inCounter * Counter::Add(const Counter * Count) { return Counter(*itsVal + Count->GetItsVal()); }
[C++ Fehler] Unit1.cpp(29): E2034 Konvertierung von 'Counter' nach 'Counter *' nicht möglich
#include <iostream.h> class Counter { public: Counter(); Counter(int initialsValue); ~Counter(); int GetItsVal() const {return *itsVal;} void SetItsVal(int x) {*itsVal = x;} Counter *Add(const Counter * Count); private: int *itsVal; }; Counter::Counter(int initialValue) {itsVal = new int(initialValue);cout << "Konstruktor" << endl;} Counter::Counter() {itsVal = new int(0); cout << "std.Konstruktor" << endl;} Counter::~Counter() {delete itsVal; itsVal = 0;cout << "Destruktor" << endl;} Counter * Counter::Add(const Counter * Count) { return Counter(*itsVal + Count->GetItsVal()); } int main() { Counter *varOne = new Counter(2); Counter *varTwo = new Counter(4); Counter *varThree = new Counter; cout << "VarOne: " << varOne->GetItsVal() << endl; cout << "VarTwo: " << varTwo->GetItsVal() << endl; varThree = varOne->Add(varTwo); cout << varThree->GetItsVal(); cin.get(); return 0; }
werd wohl noch ne weile brauchen bis ich die Zeiger verstehe.. naja ich gebe nicht auf
-
Deine Add-Methode hat als Rückgabewert Counter *, Du versuchst aber ein Counter-Objekt zurückzugeben. Genau das besagt auch die Fehlermeldung:
Cannot convert Counter to Counter *.
MfG Jester
-
wenn ich das so mache .. gehts auch nicht
Counter Counter::Add(const Counter * Count) { return Counter(*itsVal + Count->GetItsVal()); }
es erscheinen dann zusätzliche Fehlermeldungen:
[C++ Fehler] Unit1.cpp(28): E2316 'Counter::Add(const Counter *)' ist kein Element von 'Counter'
[C++ Fehler] Unit1.cpp(29): E2034 Konvertierung von 'Counter' nach 'Counter *' nicht möglichich hab schon alles ausprobiert.. das geht so und auch so nicht
eins ist aber klar.. es liegt an der Funktion.. bekomme das aber nicht gebackendanke dir jester
MFG Insane
-
hast du vielleicht in der klassendeklaration vergessen
Counter Counter::Add(...)
int
Counter* Counter::Add(..)
zu ändern?
-
jupp.. hab die Klassendeklaration vergessen
trotzdem scheint es nicht zu laufenmich regt das schon total auf.. hab schon alles möglich ausprobiert
WO IST DER WURFM??#include <iostream.h> class Counter { public: Counter(); Counter(int initialsValue); ~Counter(); int GetItsVal() const {return *itsVal;} void SetItsVal(int x) {*itsVal = x;} Counter Add(const Counter * Count); private: int *itsVal; }; Counter::Counter(int initialValue) {itsVal = new int(initialValue);cout << "Konstruktor" << endl;} Counter::Counter() {itsVal = new int(0); cout << "std.Konstruktor" << endl;} Counter::~Counter() {delete itsVal; itsVal = 0;cout << "Destruktor" << endl;} Counter Counter::Add(const Counter * Count) { return Counter(*itsVal + Count->GetItsVal()); } int main() { Counter *varOne = new Counter(2); Counter *varTwo = new Counter(4); Counter *varThree = new Counter; cout << "VarOne: " << varOne->GetItsVal() << endl; cout << "VarTwo: " << varTwo->GetItsVal() << endl; *varThree = varOne->Add(varTwo); cout << varThree->GetItsVal(); cin.get(); return 0; }
Ausgabe:
Konstruktor
Konstruktor
std.Konstruktor
VarOne: 2
VarTwo: 4
Konstruktor
Destruktor
844586344 <------------MFG Insane
-
der eingebaute zuweisungsoperator funktioniert nicht.
mach dir einen eigenen (+kopierkonstruktor) - http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=BigThree#Answ