<< Überladen
-
danke für deine antwort
mir geht es abre eher um die erste varieante
wie kann ich diese umsetzen (mit meheren << operatoren so wie in der standart bibliothek von iostream) wie muss ich dafür die operatoren überladen
-
In der Standardbibliothek ist das mit Funktionsüberladung gelöst. Das hat zudem den Vorteil, dass es nicht für alle Typen, sondern nur für diejenigen, für die eine Überladung bereitsteht, funktioniert.
-
OperatorÜberladen schrieb:
wie muss ich dafür die operatoren überladen
Du musst es zwar nicht so machen,aber üblicherweise wird für jeden Typ, den du ausgeben willst eine Funktion definiert:
class foo { ... int x; std::string whatever; ... public: friend std::ostream & operator << ( std::ostream & os , const foo & rhs ); }; std::ostream& operator << ( std::ostream & os , const foo & rhs ) { os << rhs.x << " " << rhs.whatever; return os; }
-
danke für deine antwort aber in diesem fall müsste das esrst objekt ja ein ostream objekt sein wass es in meinem fall nicht sein soll bzw soll das zweite objekt nicht die klasse sein
das erste objekt soll die klass sein die später als singleton implementiert wird
das zweit uns soll entweder sein string oder char-array objekt dastellen
also ungefähr soLOGKLASSE<<STRINGOBJEKT<<CHAR-ARRAY<<"LITERALKONST"<<std::endl;
das sollte möglich sein wär nett wenn mir da jemand einen ansatz geben könnte
-
In der Klasse machst du es dann so:
MyClass& MyClass::operator<< (const MyObject& Var) { // ... }
-
danke
funktioniert soweit auch ganz gut hab nur noch das problem das es ich std::endl nicht hinbekomme
-
OperatorÜberladen schrieb:
funktioniert soweit auch ganz gut hab nur noch das problem das es ich std::endl nicht hinbekomme
std::endlist eine Funktion, die auch als Argument vonoperator<<dienen kann. Schau dir doch mal das genauer an.
-
ich hab mir das jetz mal in ruhe angesehen aber werd daraus net schlauer entweder liegt es daran das ich übermüdet bin oder ein verständnis problem meinerseits bei diesem problem
-
Dann versuchst du es halt morgen nochmals.

Du kannst auch gerne konkret fragen, wenn du etwas nicht verstehst.
-
ich komm irgendwie nicht drauf könntest du mir vll einen weiteren ansatz dafür geben?
wäre nett von dier
-
aktuell hab ich
template<class T> LogData& operator<<(const T& Write) { std::cout<<Write; return *this; }als basis wie müsste ich das templat und die funktion für das std::endl spezalisieren wäre für jeden kleienen weiteren ansaz dankbar
-
Eben nicht als Template, sondern als überladene Funktion.
Schau dir mal Funktionszeiger an. Dann kannst du den Funktionszeiger mit der Signatur von
std::endl;als Parametertyp von deinemoperator<<verwenden.
-
dann müsste meine funktion so in der art aussehen
LogData& operator<<(const SIGNATUR* endl())
{
std::cout<<std::endl;
return *this;
}
hab ich das richtig verstanden welche signatur muss ich nehemen?
-
Sorry, ich glaube, ich hab dich falsch verstanden.
Geht es dir nur darum, alle Eingaben an
std::coutweiterzuleiten? Dann ist ein Template das einfachste.template <typename T> std::ostream& operator<< (T& Object) { return std::cout << Object; }
-
nicht wirklich ich hab eine klasse die als singletone implementiert ist (ist aber nur nebensache)
diese klasse kann bisher dashier entgegen nehmen
LogData::getInstanz()<<Hallo<<" wie gehts"<<" was machst du ";
nun soll noch die implementierung von std::endl erfolgen das dies auch möglich ist
LogData::getInstanz()<<Hallo<<" wie gehts"<<" was machst du "<<std::endl,
implementierung des bisherigen << operator steht weiter oben
-
Okay, dann wäre es wohl doch eher meine erste Version.

Ich geb dir jetzt mal den Code für die Deklaration, aber ich empfehle dir, ihn zu verstehen versuchen. Über Funktionszeiger findest du hier eine gute Seite.
LogData& operator<< (std::ostream& (*Object)(std::ostream&));
-
verstehen tu ich ihn ^^
mir war nur nicht der rückgabe wert so wie der parameter des funktionszeigers bekannt aber vielen vielen danke