2010-11-22 17 views
2

Guten Tag Sirs,Problem C++ STD Iterator Vergleichsoperatoren

weil es aussieht wie meins wird nicht so gut sein.

ich eine Klasse C, die keine Kinder hat, sondern einen Vektor von Zeigern auf Instanzen einer anderen Klasse gemacht, nennen wir es B:

class C 
{ 
    public: 
     ... 
     std::vector<B*> elements; 
     ... 
} 

B hat auch einen Vektor von Zeigern auf Instanzen einer anderen Klasse, versuchen wir es nennen:

hat
class B 
{ 
    public: 
     ... 
     std::vector<A*> elements2; 
     ... 
} 

C eine Methode, die die Elemente der Elemente und elements2 durchläuft und wie das funktioniert:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1) 
{ 
    for (it2 = it1->elements2.begin(); it12=it1->elements2.end(); ++it2) 
    { 
     it2->do_something(); //method of class A 
    } 
} 

Aber der Compiler (g ++) sagt mir immer, es gibt keine Übereinstimmung für Operator! = In (Klassenhierarchie).

Weiß jemand, was ich falsch gemacht habe? Andere Operatoren wie '<' scheinen nicht zu funktionieren.

Ich bin kein Neuling, aber es ist das erste Mal, dass ich Iteratoren in C++ benutze (früherer Python-Programmierer) und ich kann nicht wirklich herausfinden, was mit meinem Code nicht stimmt.

Danke für die Hilfe im Voraus, ich verliere meine Haare darüber!

Edit: Ich füge den gesamten Fehler als Referenz. Ich habe es bearbeitet, um die Frage zu passen, ich hoffe, ich habe nichts vermasselt:

keine Übereinstimmung für 'Operator! =' In 'it1! .std :: vector < _TP, _Alloc> :: Ende mit _TP = B *, _Alloc = std :: allocator‘

Antwort

4

Sie sollten dies versuchen:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1=this->elements.begin(); it1 != this->elements.end(); ++it1) 
{ 
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
    { 
     (*it2)->do_something(); //method of class A 
    } 
} 
  • In der inneren Schleife , Sie haben versucht, it1 (vom Typ std::vector<B*>::iterator) zu vergleichen mit it1->elements2.end() (vom Typ std::vector<A*>::iterator), so ist der Compiler richtig zu beschweren.
  • Sie haben zu dereferenzieren Iterator it2 zu ‚Reichweite‘ ein Element des Typs A*: (*it2)->do_something()

Auf einer Seite zur Kenntnis, gibt es wahrscheinlich mehr Möglichkeiten, Ihren bestehenden Code zu verbessern, aber ich werde nur ein Zustand wenige:

  • ich mit vermeiden würde this->
  • verwenden typedef, um Ihren Code Beteiligung Iteratoren
  • ich zu klären f it1 und it2 werden nicht außerhalb der Schleife verwendet wird, verengen ihren Umfang

Sie schreiben konnte (natürlich, den Vektor typedef ‚ed Namen sollten sinnvoller sein):

typedef std::vector<A*> vector_of_A; 
typedef std::vector<B*> vector_of_B; 
for (vector_of_B::iterator it1 = elements.begin(), end1 = elements.end(); it1 != end1; ++it1) 
{ 
    vector_of_A &innerVector = (*it1)->elements2; 
    for (vector_of_A::iterator it2 = innerVector.begin(), end2 = innerVector.end(); it2 != end2; ++it2) 
    { 
     /* ... */ 
    } 
} 
+0

, dass ein Tippfehler war, tut mir leid. it1 (innere Schleife) sollte natürlich it2 sein. Es kompiliert immer noch nicht. Edit: Ich bekomme den Compiler Fehler vor der inneren Schleife, sowohl auf der äußeren als auch auf der inneren Schleife. – Percival

+0

@Percival: Antwort bearbeitet – icecrime

+0

Das Erstellen von Iteratoren für die Enden der Vektoren schaltete scheinbar die Probleme des Bedieners aus, obwohl einige andere entstanden (mein Fehler wahrscheinlich). Ich frage mich, was die Ursache dafür war. Ich werde versuchen, einige der anderen Fehler zu beheben. Bis dahin ist dies die beste Antwort. Vielen Dank! Edit: funktioniert perfekt. Beste Antwort! – Percival

1

Dies sollte kompilieren:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
{ 
    for (it2 = elements2.begin(); it2 != elements2.end(); ++it2) 
    { 
     it2->do_something(); //method of class A 
    } 
} 

Aber ich weiß nicht, was Sie wirklich tun möchten.

1

Sie haben einen Vektor zu einem Zeiger. Um eine Funktion für diesen Zeiger aufzurufen, müssen Sie zuerst den Iterator dereferenzieren (um den Zeiger zu erhalten), als die Funktion darauf aufzurufen.

for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
{ 
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
    { 
     (*it2)->do_something(); //method of class A 
    } 
} 

bearbeiten: Ich denke, das Problem liegt woanders. Der folgende Code kompiliert in VS2008 und VS2010

class A 
{ 
public: 
    void Fn() 
    { 
    } 
}; 

class B 
{ 
    public: 
     std::vector<A*> elements2; 
}; 

class C 
{ 
    public: 
     std::vector<B*> elements; 

    void Fn() 
    { 
     std::vector< B* >::iterator it1; 
     std::vector< A* >::iterator it2; 

     for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
     { 
      for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
      { 
       (*it2)->Fn(); 
      } 
     } 
    } 
}; 
+0

Ich denke, das löst ein unvorhergesehenes Problem, danke! Das Betreiberproblem bleibt jedoch bestehen, und selbst wenn Ihre Antwort hilfreich und gültig ist (und mir eine Menge Ärger erspart hat), ist das Problem immer noch ungelöst :( – Percival

0

Der folgende Code funktioniert mit gcc 4.2.0 unter Linux. Welche Version verwendest du?
Vielleicht ist es die Reihenfolge, in der Sie die Klassen oder ein anderes Problem deklarieren.

#include <vector> 


class A; 
class B; 
class C; 

class A { 
    public: 
    void do_something() {}; 
}; 
class B 
{ 
    public: 
    std::vector<A*> elements2; 
}; 


class C 
{ 
    public: 
    std::vector<B*> elements; 

    void do_this() { 
     std::vector<B*>::iterator it1; 
     std::vector<A*>::iterator it2; 

     for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1) 
     { 
     for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
     { 
      (*it2)->do_something(); //method of class A 
     } 
     } 
    }; 
}; 

int main() { 
    C c; 
}; 

~
~