• 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++)

0 głosów
1,768 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 (195,220 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 (195,220 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 (195,220 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 (195,220 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,302 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
2 odpowiedzi 467 wizyt
0 głosów
1 odpowiedź 204 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...