Własna definicja operatora <<

Własna definicja operatora <<
VT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Od pewnego czasu walczę z próbą własnej implementacji operatora <<.
Chodzi mi o uzyskanie czegoś takiego jak przy przeciążeniu tego operatora do korzystania przy cout, czyli:

Kopiuj
friend ostream& operator<<(ostream& out, mojaKlasa)

Z tym że chce użyć tego operatora do zapisu w buforze wewnętrznym mojej klasy.

Kopiuj
Tklasa = nowyObiekt;
nowyObiekt << "test" << "test"; 

Próbowałem robić coś takiego:

Kopiuj
Tklasa& Tklasa::operator<<(TKlasa& out, const std::string) 

Ale kompilator rzuca się, że "operator<< must take exactly one argument"

Googlowałem troche, ale wszystko co znalazłem tyczyło się przeciążenia operatora na rzecz ostream i wykorzytania go do wyświetlania danych, tak jak przy standardowym cout.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
5

W klasie:

Kopiuj
Tklasa &operator<<(const std::string &str);

Na zewnątrz

Kopiuj
Tklasa &Tklasa::operator<<(const std::string &str)
  {
   ...
   return *this;
  }
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2

Parę słów wyjaśnienia odnośnie komunikatu błędu. Zdefiniowałeś ten operator jako metodę klasy (Tklasa::operator<<) i w tym przypadku ten operator przyjmuje tylko jeden argument, bo drugi argument jest dostępny poprzez this. Można natomiast przeciążać globalną wersję operator<<, gdzie podajesz mu 2 argumenty. W tym konkretnym przypadku jako że klasa jest Twoja, to wersja 1 wydaje się być bardziej elegancka.

Kopiuj
#include <iostream>
#include <string>
using namespace std;

struct X
{
	X& operator<<(const string& s);
};

X& X::operator<<(const string& s)
{
	cout << "X <<\n";
	return *this;
}

struct Y
{};

Y& operator<<(Y& out, const string& s)
{
	cout << "Y <<\n";
	return out;
}

int main() 
{
	X x;
	x << "ala ma kota";
	Y y;
	y << "ala ma kaca";
	return 0;
}
VT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Tak doszedłem do podobnej postaci jaką zaprezentował @_13th_Dragon, z tym że uparcie próbowałem przepchnąć dwa argumenty zapominając właśnie o tym, że przecież mam dostęp przez this.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.