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

Problem z przeciążeniem operatora==, do typu string (C++)

Object Storage Arubacloud
0 głosów
956 wizyt
pytanie zadane 17 września 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam mam taki mam problem z przeciążeniem operatora==(const class &, const class &).
W jednym z programów (wykorzystując typ char), utworzyłem takie oto przeciążenie:

"sign" to składowa klasy, dokładniej

char * sign;

bool operator==(const Magazine & st1, const Magazine & st2)
{ return strcmp(st1.sign, st2.sign) == 0 ); }

W tym momencie chciałem utworzyć odpowiednie przeciążenie dla typu string, który będzie wykonywał dokładnie to samo.

Jakiej funkcji (lub metody kodu) muszę użyć aby osiągnąć taki efekt.

1
komentarz 17 września 2018 przez j23 Mędrzec (194,920 p.)

Chodzi Ci o typ std::string, czy c-string? Jeśli to pierwsze, to std::string ma przeciążony operator == dla char*, więc możesz go użyć zamiast strcmp.

komentarz 17 września 2018 przez Sic Dyskutant (8,510 p.)
O to pierwsze. Ale jakie właśnie, próbowałem znaleźć w dokumentacji std::string ale nie ukrywam, że zawiodłem.
1
komentarz 17 września 2018 przez j23 Mędrzec (194,920 p.)

link - tu masz wszystkie warianty operatora == dla std::string.

komentarz 17 września 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję zapoznam się z tym dokładniej to coś wymyślę.
komentarz 18 września 2018 przez Sic Dyskutant (8,510 p.)
edycja 18 września 2018 przez Sic

@j23,

Spróbowałem wiele opcji, gdy dodam zamiast obiektu klasy inny typ danych. Występuje potrzebo dodania go.

if(!std::getline || temp == '\0')
                        break;

Niestety nic nie pasuje do operator==(). Problem leży w std::strcmp(), lub dodaje złe argumenty funkcji.

Oto błąd:

cannot convert ‘std::__cxx11::string* const {aka std::__cxx11::basic_string<char>* const}’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’

 

Dodatkowym błędem jest to:

std::istream & operator>>(std::istream & is, Magazine & st)
{
        std::string temp;
        std::getline(is, temp);
        if(is)
                st = temp;
        while(is && is.get() != '\n') // oba muszą nie mogą być znakiem pustym
                continue;
        return is;
}

Chodzi dokładnie o pętle while, nie bierze pod uwagę "getline()". Próbowałem wielu metod napisania tego warunku z getline, jednak wszystkie zawiodły.

Jak mógłby wyglądać ten warunek, z użyciem std::getline() ?

1
komentarz 18 września 2018 przez j23 Mędrzec (194,920 p.)
if(!std::getline || temp == '\0')
                        break;

Ojoj, a co to jest?! Jeśli to std::getline miało czytać do temp, które jest std::stringiem, to ten drugi warunek powinien wyglądać tak: temp.empty()

 

'\0' to literał znakowy i jest typu char. Zajrzyj na stronę, którą Ci podałem w linku, i zobacz, czy jest tam wariant operatora == dla znaków.

 

Oto błąd:

strcmp nie służy do porównywania std::stringów ;) Nie mieszaj C z C++, jeśli nie musisz.

komentarz 19 września 2018 przez Sic Dyskutant (8,510 p.)
W takim razie co służy do porównania std::string, bo juz nie wiem.
komentarz 19 września 2018 przez j23 Mędrzec (194,920 p.)
Przecież pisałem o operatorze ==, więc w czym problem?
komentarz 19 września 2018 przez Sic Dyskutant (8,510 p.)
Już nic, dziękuję za pomoc.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 1,161 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
2 odpowiedzi 317 wizyt
0 głosów
1 odpowiedź 135 wizyt

92,551 zapytań

141,395 odpowiedzi

319,526 komentarzy

61,936 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!

...