Własna definicja operatora <<

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:

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

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

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

Próbowałem robić coś takiego:

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.

5

W klasie:

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

Na zewnątrz

Tklasa &Tklasa::operator<<(const std::string &str)
  {
   ...
   return *this;
  }
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.

#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;
}
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1