2016-05-06 3 views
0

Also habe ich diesen Code gefunden hier, das ich arbeite mit:Mehrere Ints zu einem Vektorindex hinzufügen? ‚Cout‘ nicht funktioniert

#include <iostream> 
#include <cstdlib> 
#include <vector> 

using namespace std; 

struct Something{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    vector <Something> v; 
    int x, y; 
    cin >> x >> y; 

    Something temp; 
    temp.x = x; 
    temp.y = y; 
    v.push_back(temp); 

    for (size_t i = 0; i < v.size(); i++) 
    { 
     cout << v[i] << endl; // Error: No operator "<<" matches these operands. Operand types are std::ostream << Something 
    } 
} 

Grundsätzlich versuche ich mehrere Ints in einen Vektorindex zu erhalten. cout funktioniert nicht, wenn ich versuche, den Inhalt des Vektors zu drucken.

Zunächst einmal, mache ich diese multiple Int Sache überhaupt richtig? Ich bin relativ neu in C++.

Und wenn ich das richtig mache, irgendwelche Ideen, warum cout funktioniert nicht? Ich habe auch versucht v.push_back({x,y}) und das hat nicht funktioniert. Irgendeine Idee was mit cout los ist? Danke vielmals.


EDIT: Vielen Dank so weit. Ich habe nur noch eine Frage. Wenn ich meinen Code modifizieren würde, um mehrere Eingaben zu machen und später alles im Vektor nach "y" sortieren wollte, von der größten zur kleinsten.

Beispiel (Original-Vektor-Inhalt (x, y))

12 4 1 2 4 10 1 1 1 2

Sortiert nach 'y' (der größten zur kleinsten)

4 10 12 4 1 2 1 2 1 1

Ich weiß, wie ein tun normale Sortierung, aber keine zweite Nummer (y). Wie mache ich das? Danke vielmals.

Antwort

2

Genau wie der Fehler sagt, gibt es keine überladene operator<< Funktion für Ihre Struktur deklariert.

Es gibt drei mögliche Lösungen: Die erste ist, jedes Mitglied der Struktur zur Ausgabe, wie

std::cout << v[i].x << ' ' << v[i].y << '\n'; 

Die andere ist, um eine Funktion zu schaffen, die die oben genannten Fall ist, entweder als eine Mitgliedsfunktion oder als nicht -Mitgliedsfunktion.

Die dritte Lösung ist eine überladene operator<< Funktion für die Struktur zu schaffen:

std::ostream& operator<<(std::ostream& os, Something const& something) 
{ 
    return os << something.x << ' ' something.y; 
} 

ich Sie find a good beginners book on C++ empfehlen und die Kapitel über Ausgabe, Strukturen und Klassen und Operatoren und Operatorüberladung zu lesen.

+0

Vielen Dank bis jetzt. Ich habe nur eine weitere Frage, aber es sieht nicht gut aus, wenn ich es hier schreibe (Formatierung), also habe ich es in meine Frage als Bearbeitung eingefügt. Danke noch einmal. –

+0

@G_Man Lesen Sie über ['std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort). Es kann ein Vergleichsfunktionsargument enthalten, das alles vergleichen kann, was Sie wollen. Oder Sie könnten ['std :: greater'] (http://en.cppreference.com/w/cpp/utility/functional/greater) für Ihre Struktur spezialisieren und' std :: greater' als Vergleicher verwenden, wenn Sie 'aufrufen std :: sort'. –

0

operator<< ist nicht automatisch zwischen cout und Objekten von benutzerdefinierten Klassen verfügbar. Sie müssen definiert werden, bevor Sie verwendet werden können.

In Ihrem Fall müssen Sie Körper eine Friend-Funktion definieren, innerhalb der Struktur Definition

friend std::ostream& operator<<(std::ostream& out, Something const& s); 

der Lage sein,

cout << v[i] << endl; 

Die Implementierung der Funktion auch nicht schwierig zu bedienen.

std::ostream& operator<<(std::ostream& out, Something const& s) 
{ 
    return out << s.x << " " << s.y; 
} 

Wenn Sie wollen, können Sie verwenden:

Something s; 
std::cin >> s; 

Sie eine ähnliche Funktion definieren.

+0

Vielen Dank bis jetzt. Ich habe nur eine weitere Frage, aber es sieht nicht gut aus, wenn ich es hier schreibe (Formatierung), also habe ich es in meine Frage als Bearbeitung eingefügt. Danke noch einmal. –

0

Das Problem ist, dass << ein Operator ist. Es ist auf std::cout (das ist eine std::ostream) für eine Reihe von Typen definiert. Zum Beispiel ist es für int, definiert, weshalb dies funktioniert:

std::cout << 3; 

aber Sie versuchen, die operator<< zu Ihrer eigenen Something Klasse bewerben, aber es hat keine solche Operator Definition. Sie können es so hinzufügen:

struct Something { 
    // Other stuff here 
    friend std::ostream& operator<<(std::ostream& os, Something const& smth) ; 
}; 

std::ostream& operator<<(std::ostream& os, Something const& smth) { 
    os << "(" << smth.x << ", " << smth.y << ")"; 
    return os; 
} 

Dann sollte Ihr Code funktionieren. Das Überladen dieses Operators ist tatsächlich schwieriger als das Überladen anderer, weil Sie verstehen müssen, was friend tut.

Edit:

friend ist eigentlich nicht in Ihrem Fall erforderlich, weil x und y öffentlich sind. Aber im Allgemeinen benötigen Sie es, um private Mitglieder Ihrer Klasse drucken zu können.

Edit 2:

Um die vorherige Bearbeitung deutlich zu machen, können Sie die gesamte in-Strukturdeklaration des Betreibers kann verzichtet werden, da es global nachgeschlagen werden. Sie brauchen es nur (und dann muss es friend ly) sein, wenn der Operator private Mitglieder lesen muss.

+0

Wenn der Compiler einen Ausdruck wie 'cout << s 'sieht, ruft er _global function_' operator << 'auf, also müssen Sie ihn innerhalb der Klasse' Something' als 'Freund' deklarieren :) – someOne

+0

Sie Hab recht, danke! Angepasst, um das widerzuspiegeln. –

+0

Vielen, vielen Dank bis jetzt. Ich habe nur eine weitere Frage, aber es sieht nicht gut aus, wenn ich es hier schreibe (Formatierung), also habe ich es in meine Frage als Bearbeitung eingefügt. Danke noch einmal. –

Verwandte Themen