Ich schrieb ein kleines Musikprogramm unter Windows zum Spaß. Ich fand den Teil des Codes falsch. Dies ist der minimierte Code (MCVE) zur Wiedergabe des Problems:Seltsames Verhalten für überlastete I/O-Operator in Klasse
#include <iostream>
using std::istream;
using std::cin;
using std::cout;
using std::cerr; // Debug output goes to stderr
using std::endl;
class Key {
public:
typedef signed char Pitch, Octave; // -128 to 127
typedef signed long Absolute; // -2147M to 2147M
Pitch p;
Octave o;
public:
Key(const Pitch& _p, const Octave& _o) :
p(_p), o(_o) {}
Key(void) : Key(Pitch(0), Octave(0)) {};
Absolute abs(void) const {
return 12L * Absolute(o) + Absolute(p);
}
friend istream& operator>> (istream&, Key&);
};
istream& operator>> (istream& is, Key& k){
return (is >> k.p >> k.o);
}
Und hier ist das Laufteil:
Key k;
cin >> k;
cout << k.abs() << endl;
Da der Eingang 0 0
wird der Ausgang soll 0
sein, aber die tatsächliche Ausgabe ist lächerlich groß (624
). Ich habe versucht, diese
cerr << k.p << k.o << endl;
Und der Ausgang ist 00
(kein Raum zwischen siehe Code), wie erwartet.
@StoryTeller Es ist meine Schuld. Ich habe meinen PC nach dem Programmieren heruntergefahren und bin (wie üblich) im Internet auf meinem 5,5 "Android-Handy, einschließlich SO, gelaufen. Ich habe den Code neu geschrieben, so dass in Fragen und Antworten neue Tippfehler auftreten. – iBug
In Ordnung ist jetzt richtig, keine schlechte Frage – StoryTeller