std::vector Problem wegen fehlenden CopyCtor
-
Sorry das ich den Titel etwas doof gewählt habe, aber ich wusste nicht wie ich das Problem kompakter packen sollte.
Folgende Klassen existieren:
class Complex_Rule : public IEnumerable<std::tr1::shared_ptr<IRule> > { private: std::queue<std::tr1::shared_ptr<IRule> > rules; std::tr1::shared_ptr<IRule> current_value; std::vector<std::string> error_messages; public: typedef std::tr1::shared_ptr<IRule> Rule; void add(std::tr1::shared_ptr<IRule> rule); void validate(const Token& token); const std::vector<std::string>& get_error_messages()const; virtual bool move_next(); virtual const std::tr1::shared_ptr<IRule>& current() const; virtual void reset(); };class Rule_Repository : public IEnumerable<Complex_Rule> { private: std::vector<Complex_Rule> rules; std::vector<Complex_Rule>::iterator currentValue; public: Rule_Repository(const std::vector<Complex_Rule>&); Rule_Repository(); void add(const Complex_Rule&); virtual bool move_next(); virtual const Complex_Rule& current()const; virtual void reset(); };Vielleicht noch die Implementation zu der zweiten Klasse:
Rule_Repository::Rule_Repository(const std::vector<Complex_Rule>& complex_rules):rules(complex_rules) { this->currentValue = this->rules.begin()-1; } Rule_Repository::Rule_Repository() { this->currentValue = this->rules.begin() -1; } bool Rule_Repository::move_next() { return (currentValue++ != this->rules.end()-1); } const Complex_Rule& Rule_Repository::current()const { return *currentValue; } void Rule_Repository::reset() { this->currentValue = this->rules.begin()-1; } void Rule_Repository::add(const Complex_Rule& rule) { this->rules.push_back(rule); }Das Rule Repository wird so befüllt:
Rule_Repository repo(crules); // wobei crules nen Vector von Complex rules ist.Ich bekomme nun beim Aufruf der current() Methode des Rule_Repositorys nen Programmabsturz. Meine Befürchtung ist ja, das der vector den ich im Rule_Repository halte, dieser Kopien von meinen Complexrules erstellt wenn ich ihm nen vector in den Ctor des RuleRepository reinwerfe und da ich für den Typ Complex_Rule keinen CopyCtor und Assignmentoperator definiert habe ich dort keine Korrekten Kopieen bekomme, kann das sein oder fällt jemanden ein anderer Fehler auf?
-
Die add Methode macht den Iterator currentValue u.U. ungültig, daher könnte so ein Fehler z.B. kommen. Und begin() kann man eiegntlich auch nicht sinnvoll dekrementieren. Genau sagen kann man es aber nur, wenn man weiß was Du da aufrufst. Du könntest auch einfach mal selber debuggen, dann wirst du eiegntlich sehen was da passiert.
Im übrigen finde ich das was du da machst fürchterlich. Irgendwie schlecht von C# abgeguckt oder was soll das sein. Diese Enumerier Geschichte solltest Du vom Container trennen (wie es bei C# doch auch im Enumerator ist, oder?). Aber noch schöner wäre es einfach dem C++ Iterator Konzept zu folgen und nicht irgendwas an das Du gewöhnt bist nachzubasteln.
-
Olla brotbernd. Danke für deine Hilfe, ich glaube du hast mir die Augen geöffnet. Ich denke ich werde das IEnumerable Prinzip verwerfen und mich dem gewohnten Iteratorprinzip von C++ zuwenden.
Wie du schon sagtest: Gewohnte Sachen macht man lieber

Danke für den Einwand

-
Ich bin dem Rat von brotbernd gefolgt. Gefällt mir auch besser.
Wollte nochmal die überarbeitete Version zeigen und hab damit auch direkt ein weiteres Problem. Ich glaube der shared_ptr wird nicht richtig kopiert und ich da krieg ich irgendwie nen Laufzeitfehler. Ich werde mal die Überarbeitete Klasse zeigen und die Stelle an der der Fehler auftritt. Vielleicht hab ich nur was marginales Übersehen.
class Complex_Rule { private: std::vector<std::tr1::shared_ptr<IRule> > rules; std::vector<std::string> error_messages; public: typedef std::tr1::shared_ptr<IRule> Rule; typedef std::vector<std::tr1::shared_ptr<IRule> >::const_iterator iterator; void add(std::tr1::shared_ptr<IRule> rule); void validate(const Token& token); const std::vector<std::string>& get_error_messages()const; iterator begin() const; iterator end() const; };zugehörige Implementation
void Complex_Rule::add(std::tr1::shared_ptr<IRule> rule) { this->rules.push_back(rule); } Complex_Rule::iterator Complex_Rule::begin() const { return this->rules.begin(); } Complex_Rule::iterator Complex_Rule::end() const { return this->rules.end(); } const std::vector<std::string>& Complex_Rule::get_error_messages()const { return this->error_messages; } void Complex_Rule::validate(const Token& token) { for(std::vector<std::tr1::shared_ptr<IRule> >::iterator iter; iter != this->end();iter++) { std::tr1::shared_ptr<IRule> r(*iter); // hier krachts wenn ich durch debugge. if(!r->validate(token)) { std::cout<<r->get_error_message()<<std::endl; } } }Kann mir einer erklären was ich an der Stelle falsch mache?
-
Omg wie blind muss man sein.
Hab das initialisieren des iterators in der Schleife vergessen -.-Sorry !:D