2012-03-29 2 views
0

Das ist mein Testprogramm. Die Variable s1 enthält einen Vektor, der Objekte eines benutzerdefinierten Typs enthält. Ich möchte den Operator < < überladen, um diesen Vektor nett zu drucken, ein Element pro Zeile.Wie man über ein Vektordatenelement von einem überschriebenen Operator iteriert <<

#include <iostream> 
#include "myclasses.h" 
using namespace std; 

int main() { 

    myclass s1; 

    s1.add_point(7000, 10); 
    s1.add_point(8000, 11); 
    s1.add_point(9000, 12); 

    cout << s1 << endl; 

    return 0; 

} 

Hier ist die Klassendefinition. Im Grunde ist es nur ein Array von anderen benutzerdefinierten Objekten. Ich möchte den Operator < < drucken alle Einträge, einen pro Zeile. Angenommen, "anotherclass" verfügt über die erforderlichen Unterstützungsmethoden.

Ich habe eine Zeile kommentiert, die ich hinzufügen musste, um dies in meinem Programm zu arbeiten. Ich habe keine Ahnung, warum diese Linie benötigt wird. Kann mir das jemand erklären?

Antwort

4

Der Elementtyp iterator ermöglicht immer das Ändern des referenzierten Objekts. Daher können Sie kein iterator von einem const & Argument wie s erhalten. Sie müssen die lokale Variable mit dem Typ vector<anotherclass>::const_iterator deklarieren. Jede Containerklasse hat eine const_iterator parallel zu iterator.

Der Grund für Ihre One-Line-Korrektur ist, dass die neu erstellte vector nicht const ist, im Gegensatz zu dem Funktionsparameter, aus dem sie konstruiert wurde.

In C++ 11 können Sie einfach auto itr = s.ps.begin() verwenden und den Iteratortyp nie benennen. Oder verwenden Sie einfach for (auto const &obj : s.ps) und verzichten Sie vollständig auf Iteratoren.

+0

Großartig! Ich habe zwei große Bücher über C++, die ich studiert habe, einschließlich Bjarnes Principle and Practices tome. Kein Buch erwähnt dies. (Bjarnes Buch enthält eine einzige Erwähnung von konstanten Iteratoren in einer Tabelle in Anhang B). Danke auch für die anderen Tipps. –

1

Meine Vermutung ist, weil Sie s als const deklarieren, so dass der Zugriff auf seinen Iterator nicht zulässig ist. Wenn Sie den Vektor psp = s.ps verwenden, kopiert Ihr Programm im Wesentlichen s.ps in einen neuen Vektor psp, der geändert werden kann.