problem mit auto_ptr
-
hallo leute,
ich habe ein, sicher kleines, problem mit auto_ptr und zwar: ich habe ein kleines beispiel mit auto_ptr geschrieben das sich aus einer abstrakte klasse Person und zwei abgeleiteten klassen Man und Frau besteht. diese klassen haben eine methode clone die ein neues objekt (instanz) zurückliefern soll. diese methode sieht (für die Man klasse) so aus:
Man *clone() { return( new Man(*this) ); }ok, dann habe ich eine Factory klasse geschrieben die dazu bestimmt ist eine neue instanz von einer registrierte klasse zurückzuliefern. dies habe ich so gemacht: ich registriere meine klassen (in diesem fall Man und Frau), die die Factory erzeugen und zurückliefern kann. wenn ich eine klase erzeugen will die bei der Factory nicht registriert ist, kriege ich selbstverständlich, eine fehlermeldung. das ist aber nicht wichtig. die metode aus factory die diese neue instanz zurückliefert sieht so aus:
auto_ptr<Person> getInstance(id) { if(validTypeOfObjekt(int id)) // id ist id von einem registriertem objekt // (map) { iterator = ... return ( iterator->second->clone() ) } else error() }dies alles funktioniert ganz gut, aber...
int main() { Factory *temp_factory = new Factory(); // hier registriere ich meine klassen bei Factory // zB. temp_factory->registerTypeOfObjekt(1, new Man()); usw. <auto_ptr> temp(temp_factory->getInstance(1)); temp->sayHello(); // output soll sein: Hallo, ich bin ein Man delete temp_factory; return 0; }ich kriege kein output. mich interessiert warum nicht. habe auch die getInstance methode verändert so dass diese überprüft ob ein objekt von der clone methode gekommen ist -> ist ok. warum kriege ich nichts in main? danke im voraus für jede hilfe. ach ja, den code kann ich auch schicken.
mfg,
erno
-
ich habs auch drüben dazu geschrieben...
Könnte es sein das dein objekt nich registriert wurde?
probiers mal so:auto_ptr<Person> getInstance(id) { if(validTypeOfObjekt(int id)) // id ist id von einem registriertem objekt // (map) { iterator = ... return ( iterator->second->clone() ) } else { std::cout << "not registered!" << endl; return NULL; } }also immer fehler abfrage einbauen ud bei ner If deghört auch ein else dazu....
zumindest in 99% aller fälle...
Mfg Shade37337
-
objekte werden registriert und habe ein else dazugeschrieben. wie ich es gesagt habe, das objekt wird zu getInstance() zurückgeliefert aber nicht zu main(), also, habe folgendes gemacht: in getInstance() habe die methode sayHello() aufgerufen und da kriege ich einen output, in main aber nicht. also kein fehler in code, sondern bei der übergabe. danke.
-
dann probier mal debug messages,
soll heisen du schreibst immmer da wo du sicher sein willst,
dass des prog den code abgearbeitet hat ein:std::cout << "DEBUG: Funktion blah, line xy" << std::endl;oda so was ähnliches.
das hilft oft.
also für getinstance folgender code:auto_ptr<Person> getInstance(id) { if(validTypeOfObjekt(int id)) // id ist id von einem registriertem objekt // (map) { std::cout << "DEBUG: Registered !" << std::endl; //Code } else { std::cout << "DEBUG: NOT Registered!" << endl; //CODE } }dann kannst du rausfinden z.b. an welcher zeile des liegt
Mfg Shade37337
-
[quote="shade37337"]dann probier mal debug messages,
soll heisen du schreibst immmer da wo du sicher sein willst,
dass des prog den code abgearbeitet hat ein:std::cout << "DEBUG: Funktion blah, line xy" << std::endl;oda so was ähnliches.
das hilft oft.
also für getinstance folgender code:auto_ptr<Person> getInstance(id) { if(validTypeOfObjekt(int id)) // id ist id von einem registriertem objekt // (map) { std::cout << "DEBUG: Registered !" << std::endl; //Code } else { std::cout << "DEBUG: NOT Registered!" << endl; //CODE } }habe das alles ausprobiert. wie ich schon sagte, in der methode getInstance gibt's keine probleme sondern in main. dort gibt es auch keine probleme mit dem compiler oder linker, also, der code wird compiliert, aber das wird nicht korrekt übergeben. was ich fragen will, kann ich überhaupt so ein objekt übergeben. ich kann dir auch den ganzen code schicken. es wäre zu gross hier zu posten (oder?). danke
-
post mal....
aber ich kann frühestens heut abend antworten.Mfg Shade37337
-
hat sich schon erledigt ;-). das problem war dass ich nicht direkt dieses cloneobjekt zurückliefern durfte, sondern musste ich zuerst das objekt zu einem auto_ptr zuweisen und erst dann zurückliefern: die methode getInstance sieht nun so aus:
auto_ptr<Person> getInstance(id) { if(validTypeOfObjekt(int id)) // id ist id von einem registriertem objekt // (map) { iterator = ... auto_ptr<Person> temp(iterator->second->clone()); return ( temp ); } else error() }danke

mfg,
erno