• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeciążanie operatorów

Object Storage Arubacloud
0 głosów
493 wizyt
pytanie zadane 27 maja 2018 w C i C++ przez krystian1997 Obywatel (1,020 p.)

Witam,

mam problem z operatorem ">>" i "<<". Mianowicie podczas tworzenia klasy przy kompilacji otrzymuje błędy:
Error    C2679    binary '<<': no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion) oraz
Error (active)    E0349    no operator "<<" matches these operands

Otworzyłem kody błędów w przeglądarce i wyczytałem coś o przeciążaniu operatorów ale nie wiem jak to zrobić. Można chyba skorzystać z funkcji operator ale nie wiem jak jej użyć, zresztą nie powinna być ona potrzebna do stworzenia programu. Chciałbym żeby ktoś przybliżył mi na czym polega błąd i wyjaśnił całe to przeciążanie jeśli o tym mowa. Pozdrawiam

 

 

void daj_glos()
	{
		if (gatunek == "kot") cout << imie << " lat" << wiek << ": miau";
		else if (gatunek == "koza")  cout << imie << " lat" << wiek << ": meee";
		else if (gatunek == "krowa")  cout << imie << " lat" << wiek << ": muuu";
		else cout << "Nieznany gatunek";
	}

 

1 odpowiedź

+1 głos
odpowiedź 27 maja 2018 przez RafalS VIP (122,820 p.)

Jeśli obiekty które próbujesz wypisac operatorem << to stringi to prawdopodobnie zapomniałes zaincludować:

#include <string>

Sama deklaracja stringa działa, bo "część" nagłówka string została zaincludowana przez nagłówek <iostream>. Jednak nie było tam przeładowania operatora <<, wiec kod się nie kompiluje mimo, że mogłeś używać samego typu.

String w środku mógłby wyglądać jakoś tak:
 

class UbogiString {
public:
	UbogiString & operator=(const char *s) {
		tab = s;
	}
private:
	const char * tab;
};

//bez tego kompilator nie wiedzialby co zrobić gdy zobaczy
//cout<<obiektTejKlasy
ostream& operator<<(ostream& out, const UbogiString& s) {
	out << s;
	return out;
}

int main()
{
	UbogiString s;
	s = "Polska dla polakow, ziemia dla ziemniakow";
	cout << s << endl;
	return 0;
}

Gdy nie zaincludowałeś <string> to brakowało Ci tej funkcji, która mówi kompilatorowi co ma zrobić gdy zobaczy cout<<obiektTwojejKlasy;

Co do samego przeciążania: zdefiniowałem co ma się stać gdy spróbuje przypisać const char* do obiektu klasy UbogiString i co ma się stać gdy spróbuje zrobić cout<<obiektKlasyUbogiString;.

Reszte poczytaj na necie, o przeciążaniu jest mnóstwo tutoriali w każdym języku i pozimie zaawansowania.

komentarz 27 maja 2018 przez krystian1997 Obywatel (1,020 p.)
Już wiem o co chodzi. Dodałem biblioteke <string> i wszystko działa. To przeciążanie oagrnę sobie na spokojnie. Dzięki za pomoc, pozdrawiam

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
0 głosów
1 odpowiedź 460 wizyt
+1 głos
0 odpowiedzi 354 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...