Operatoren überladen

klo

Mitglied
Hallo

ich habe eine Frage unzwar zu Operatoren überladen.

Folgendes zb bei der Klasse ostream als sowohl bei der Klasse String ist der << Operator überladen.

Nun ist meine Frage welche Operator kommt hier zum tragen?

Ich würden nämlich gerne eine meiner Klassen mit << per cout ausgeben und ich würde gerne wissen wie ich das ganze überladen kann/muss.


Weiters würdes es mich interresieren was ist wenn In Klasse A ein Operator für A-B existiert...
und in Klasse B ein Operator -B existiert was macht der Compiler hier für welchen Operator entscheidet er sich A ?(-B) würde ja nicht viel sinn ergeben oder doch?

lg Klo
 
Hi

Zur zweiten Frage:
A-B = operator-(B) in A
-B in B = operator-(B) in B
Bei A-B wird also der Erste, bei B-B der Zweite verwendet.

Zur ersten Frage:
Man kann auch Casts als Operatoren überladen.
Beispiel:
C++:
class a
{
public:
    int i;
    operator int(){return i;}
};
...
a x;
x.i=123;
int y=x;
Alles klar?
Genauso gehts mit jedem anderen Variablentyp.
Auch mit Stirngs, die cout erwartet usw...

Gruß
 
Thx für die Schnelle Antwort.

Also zu 1.)

Frage ist das richtig rüber gekommen mit -B dabei meinte ich sowas wie:
kcomplex = -complex; // wobei beide von der Klasse Complex sind.


2.) hm ich weiß noch immer nicht was ich überladen muss für den schiebe oberator damit er meine Klasse frisst... ein "operator char*()"?

weil hier ist es ersichtlich mit int, bei einem cout<<MeineKlasse operator nicht ....
 
1) Ach so, ich dachte zuerst an a - b
Das Minus als Vorzeichen ist was Eigenes.
C++:
Complex operator-(){...return ...;}
Einfach ohne Parameter

2)Genau.
C++:
operator char*(){...return ...;}
Keinen Rückgabetyp angeben, der ist in dem Fall automatisch char*
Entsprechend muss natürlich auch das return sein.

Da cout aber statt Strings auch ints, floats etc nehmen kann, kannst du auch einen der anderen Grundtypen verwenden; je nachdem was am besten zu Complex passt.

Gruß
 
Wäre es nicht irgendwie für den ersten Typ einfacher wie alle anderen << operatoren ihn als globalen Operator zu überladen?
C++:
class Foo
{
   friend std::ostream& operator<<(std::ostream&, const Foo&);
private:
   int m_value;
public:
   Foo() : m_value(3) { }
};

std::ostream& operator << (std::ostream& strm, const Foo& a)
{
   strm << "a.m_value = " << a.m_value;
   return strm;
}

Als ein Beispiel.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: klo
Thx...

frage kann kann ich den Operator in einen Namespace packen und beliebig "nur" diesen per using raus holen? Bzw macht das sin oder wie platzier ich das am sinnvollsten?

lg klo
 
Grundsätzlich schon, ja:
C++:
class Foo;

namespace Bar
{
	std::ostream& operator << (std::ostream&, const Foo&);
};

class Foo
{
   friend std::ostream& Bar::operator << (std::ostream&, const Foo&);
private:
   int m_value;
public:
   Foo() : m_value(3) { }
};

namespace Bar
{
	std::ostream& operator << (std::ostream& strm, const Foo& a)
	{
	   strm << "a.m_value = " << a.m_value;
	   return strm;
	}
}

int main()
{
	using Bar::operator<<;
	Foo f;
	std::cout << f << std::endl;
}
 
Zurück