Funktion druckt etwas auf std::ostream und gibt std::ostream?
Ich möchte eine Funktion schreiben, die Ausgänge etwas zu einem ostream
übergeben wird, und die Rückkehr der stream, wie diese:
std::ostream& MyPrint(int val, std::ostream* out) {
*out << val;
return *out;
}
int main(int argc, char** argv){
std::cout << "Value: " << MyPrint(12, &std::cout) << std::endl;
return 0;
}
Wäre es bequem zum ausdrucken der Wert wie diese und Betten Sie die Funktion aufrufen, die in der Ausgabe-operator Kette, wie ich in main()
.
Es nicht funktioniert, aber, und druckt diese:
$ ./a.out
12Value: 0x6013a8
Die gewünschte Ausgabe wäre:
Value: 12
Wie kann ich dieses Problem beheben? Muss ich zum definieren einer operator<<
statt?
UPDATE: Geklärt, was die gewünschte Ausgabe wäre.
UPDATE2: Einige Leute nicht verstehen, warum ich drucken würde eine Nummer wie das mit einer Funktion anstelle von drucken es direkt aus. Dies ist ein Vereinfachtes Beispiel, und in Wirklichkeit die Funktion drucken Sie ein Komplexes Objekt, anstatt ein int
.
Vielleicht hat er ' s gelesen, die Google-style guide und kaufte sich in dieser "nicht verwenden non-const Referenz-Parameter" Mode, die gehen, um.
Auch, was ist der Punkt nicht zu tun
cout << "Value: " << 12;
wie @Neil empfiehlt? Das scheint die meisten geradlinig Lösung.und @onebyone: ja, ich begann mit dem google-Konventionen.
Re: UPDATE2 -- drucken Sie diese komplexen Objekts von Euch, warum sich nicht einfach definieren einer neuen überladenen std::operator<< für diesen Typ, genau wie jeder andere normale Klasse verwendet?
InformationsquelleAutor Frank | 2009-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht, lösen Sie die Funktion aus. Nichts in der spec erfordert einen compiler zu bewerten, einen Aufruf der Funktion in einem Ausdruck in einer bestimmten Reihenfolge mit Bezug auf einige unabhängige Betreiber im gleichen Ausdruck. Also ohne änderung des aufrufenden Codes, kann man nicht machen
MyPrint()
bewerten nachstd::cout << "Value: "
- Links-nach-rechts, um den Auftrag für die Ausdrücke, bestehend aus mehreren aufeinander folgenden << Operatoren, so dass es funktionieren wird. Der point-of-operator<< Rückgabe des Streams ist, dass, wenn die Bediener sind angekettet, die LS jeweils geliefert wird, durch die Auswertung des operators auf der linken Seite.
Können Sie nicht erreichen, die gleiche Sache mit free-Funktion Anrufe, weil Sie nicht über einen LS.
MyPrint()
gibt ein Objekt zurück, gleichstd::cout
, und so hatstd::cout << "Value: "
sind, so sind Sie effektiv zu tunstd::cout << std::cout
Druck, der hex-Wert.Da der gewünschte output ist:
die "richtige" Sache zu tun ist in der Tat zu überschreiben operator<<. Dieses bedeutet Häufig müssen Sie entweder machen es zu einem Freund, oder tun Sie dies:
Beim überschreiben
operator<<
für Ihre Klasse nicht angemessen ist, zum Beispiel, weil es mehrere Formate, die Sie wollen, um zu drucken, und Sie möchten, schreiben Sie eine andere Funktion für jeden, dann sollten Sie entweder auf die Idee der Betreiber, die die Verkettung und einfach die Funktion aufrufen, oder anderes schreiben mehrere Klassen, die nehmen Ihr Objekt als Konstruktor-parameter, die jeweils mit verschiedenen operator-überladungen.Ich sicherlich don ' T mind: vielen Dank!
Ich aktualisierte die Frage; er sagt nun, dass die gewünschte Ausgabe wäre-Wert: 12.
Sie haben wahrscheinlich vergessen
return
- Anweisung am Ende deroperator<<
Umsetzung:return out;
.InformationsquelleAutor Steve Jessop
Sie wollen MyPrint eine Klasse mit friend-operator<<:
Diese Methode erfordert, dass Sie zum einfügen der MyPrint-Objekt in den stream Ihrer Wahl. Wenn Sie WIRKLICH brauchen, die Fähigkeit zum ändern der stream aktiv ist, können Sie dies tun:
Wie so? Bitte erklären.
Nun, mit zu beginnen, es wird nicht kompiliert.
Es muss nicht ein Freund zu sein; es nutzt nur die öffentlichen Methoden von std::ostream.
Lybbert. 1) Was meinst du mit "Methode"? 2) Die Funktion
operator<<
in seinem code ist nicht ein Mitglied der Klasse. Entfernen Sie das friend-Schlüsselwort wäre es ein Mitglied, aber würde der code ungültig ist, weil ein Mitgliedoperator<<
muss ein parameter nur. Es heißt "Freund" - definition.InformationsquelleAutor rlbond
Haben Sie zwei Möglichkeiten. Die ersten, die mit dem, was Sie bereits ist:
Den anderen, das ist mehr C++-like, ist zu ersetzen
MyPrint()
mit den entsprechendenstd::ostream& operator<<
. Es gibt bereits eine fürint
, also ich mache gerade ein bisschen komplexer:InformationsquelleAutor Max Lybbert
Es gibt keine Möglichkeit, das zu tun, was Sie erwarten, weil die Reihenfolge der Funktionen bewertet.
Gibt es einen bestimmten Grund, warum Sie benötigen, schreiben Sie direkt an den ostream so? Wenn nicht, haben MyPrint einen string zurückgeben. Wenn Sie möchten, verwenden Sie einen stream innerhalb MyPrint um die Ausgabe zu erzeugen, verwenden Sie einfach ein strstream-und das Ergebnis zurückgeben.
InformationsquelleAutor Gerald
Erste, es gibt keinen Grund, sich nicht zu übergeben, in der
ostream
durch einen Verweis statt durch einen Zeiger:Wenn Sie wirklich nicht wollen, zu verwenden
std::ostream& operator<<(std::ostream& os, TYPE)
Sie dies tun können:Ich sehe nicht, wie eine nicht-const-Zeiger vorzuziehen wäre, eine nicht-const-Referenz in jeder vernünftige coding standard.
Google sagt "Referenzen kann verwirrend sein, da Sie Wert-syntax, jedoch Zeiger Semantik" (google-styleguide.googlecode.com/svn/trunk/...). Ich denke, Sie bedeuten, dass pass-by-value und pass-by-reference-look das gleiche auf der call-Seite, damit Sie denke, code ist besser lesbar, wenn der Leser können davon ausgehen, dass alles, was aussieht wie ein pass-by-value, lässt den Wert unverändert. Und wie das Sprichwort sagt, Google ist verrückt wie ein Fuchs. Es hat einige etwas altmodische Einstellung zu C++, aber ich denke nicht irrational.
Die standard -
operator<<
notation nimmt diestd::ostream
durch Referenz als input; da dieser Kerl versucht zu emulieren ostream Funktionalität, es wäre besser, entsprechend der syntax statt der übergabe einer Referenz. Plus, er ist die Rückgabe einer Referenz auf die dereferenzierter Zeiger! Wenn Sie einen Zeiger haben, müssten Sie nennen so etwas wieMyPrint(12, &(std::cout << "Value:") );
das ist einfach nur peinlich. Sie übergeben einen Zeiger auf ein temporäres Objekt."Das standard-operator<< notation nimmt die std::ostream durch Referenz als input". Ja, Google Notizen ", die für einige Anwendungen" als "Con" Ihrer "keine nicht-const-reference" - Regel. Dies ist unter den Gründen, die ich nicht einverstanden mit der Regel: es ist ein ziemlich killer "Con" 🙂
InformationsquelleAutor Seth Johnson
Nach dem ändern der Zeiger auf eine Referenz, können Sie dies tun:
Die syntax für
MyPrint
ist im wesentlichen, dass der eine entrollteoperator<<
aber mit einem extra-argument.InformationsquelleAutor Seth Johnson
In Ihrem Fall offensichtlich ist die Antwort:
Wenn das nicht gut genug ist, erklären Sie bitte, welche Ausgabe, die Sie sehen wollen.
Im Gegensatz zu vielen Menschen Runde hier, ich habe nicht die glückliche Anlage, das Verständnis der "offensichtliche" unausgesprochene Frage - ich mag Dinge geschrieben.
Ich denke, Sie sollten chage Ihr Symbol, um ein mürrischer konfrontiert Seestern 🙁
Wenn du mich findest, ich werde es gerne verwenden.
InformationsquelleAutor