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

Przeciążenie operatorów typu bool (C++)

VPS Starter Arubacloud
0 głosów
877 wizyt
pytanie zadane 5 sierpnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam postanowiłem stworzyć funkcję zaprzyjaźnioną przeciążającą znaki dzielenia i modulo oraz potęgowania. Mam problem z doborem typów danych:

bool operator%(int i_value, const Stonewt & value)
{
        Stonewt result = Stonewt(value.stone % i_value, value.pds_left % i_value); //??
        std::cout << result;
        return true;
}

błąd pojawia się podczas konwersji 'int' na typ binarny. Pytanie jak rozwiązać ten problem ? (nie mam żadnego pomysłu).

komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)

Nie jesteśmy w stanie pomóc na podstawie tego co wrzuciłeś. Co przyjmuje wywoływany konstruktor? Jakiego typu jest składowa stone?

No i czemu operator modulo zwraca zawsze true?

typ binarny

co to jest typ binarny :P? 

komentarz 5 sierpnia 2018 przez Sic Dyskutant (8,510 p.)
edycja 5 sierpnia 2018 przez Sic
Stonewt::Stonewt(int stn, double lbs)
{
        stone = stn;
        pds_left = lbs;
        pounds = stn * Lbs_per_stn + lbs;
}

int stone;

Nie wiem co mógłby zwracać, skoro może zwrócić 0 lub 1.

Mialem tak podane w błędzie więc tym się zasugerowałem ;).

Gdy spróbowałem normalnego przeciążenia wyskoczyły mi takie błędy:

stonewt.cpp:38:59: error: ‘bool Stonewt::operator%(int, const Stonewt&)’ must take exactly one argument
 bool Stonewt::operator%(int i_value, const Stonewt & value) 
                                                           ^
stonewt.cpp:45:59: error: ‘bool Stonewt::operator^(int, const Stonewt&)’ must take exactly one argument
 bool Stonewt::operator^(int i_value, const Stonewt & value)
                                                           ^

Jak jest jeden to wymaga dwóch argumentów. Dlaczego ?

komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)
Blad, ktory Ci wyskoczyl wynika z tego, ze jesli operator jest metoda skladowa klasy to niejawnie przyjmuje obiekt klasy na ktorym jest wywolany jako "pierwszy argument" - lewy operand. Dlatego gdy sam podales mu 2 argumenty to razem z niejawnym sa juz 3, a to nie ma sensu.

Sytuacja nie ma miejsca gdy operator jest zwykla funkcja lezaca poza klasa.

Dalej jednak nie ogarniam o co chodziło Ci w pierwotnym pytaniu ;/
komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)
Podaj dokladny error z ta konwersja na "typ binarny"
komentarz 5 sierpnia 2018 przez Sic Dyskutant (8,510 p.)

Pojawia się podczas zaprzyjaźnienia

stonewt.cpp: In function ‘bool operator^(int, const Stonewt&)’:
stonewt.cpp:47:74: error: invalid operands of types ‘const double’ and ‘int’ to binary ‘operator^’
       Stonewt result = Stonewt(value.stone ^ i_value, value.pds_left ^ i_value); /
komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)
Nastepnym razem od razu wrzuc wrzuc komunikat bledu. Robisz double xor int, a dziala on tylko z intami. Zaprzyjaznianie i przeciazenie operatora nie maja tutaj nic do rzeczy. double ^ int to zawsze blad

1 odpowiedź

+1 głos
odpowiedź 5 sierpnia 2018 przez niezalogowany
wybrane 18 września 2018 przez Sic
 
Najlepsza

Operator modulo nie może przyjmować double i int:

prog.cc:50:72: error: invalid operands of types 'const double' and 'int' to binary 'operator%'
         Stonewt result = Stonewt(value.stone % i_value, value.pds_left % i_value); //??

Natomiast na dwóch intach taka operacja jak najbardziej ma sens:

Stonewt result = Stonewt(value.stone % i_value, static_cast<int>(value.pds_left) % i_value);
komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)
Z ciekawości, gdzie zauwazyles, ze kolega robi double%int? Bo ja nigdzie nie widze tutaj doubli i sie zastanaiwam czy wszystko ze mna ok :D
komentarz 5 sierpnia 2018 przez niezalogowany
Pamiętam z innego tematu tego samego autora gdzie znajduje się cały kod tej klasy :D Chociaż po konstruktorze też można byłoby dojść do takiego wniosku :D
komentarz 5 sierpnia 2018 przez Sic Dyskutant (8,510 p.)

@Hipcio,

Zrobiłem z jednym argumentem, sugerując się tym co mówił @RafalS  i łączączenie tych dwóch rzeczy dało prawidłowe rozwiązanie problem z konwersją.

bool Stonewt::operator^(const Stonewt & value) const
{
        Stonewt result = Stonewt(value.stone ^ stone, static_cast<int>(value.pds_left) ^ stone);
        std::cout << result;
        return true;
}

Tylko mam do tego pytanie w jaki sposób wywołać taką metodę ?

komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)
Ale wiesz, ze ^ oznacza bitowe xor a nie potege :p?
1
komentarz 5 sierpnia 2018 przez RafalS VIP (122,820 p.)

Przeciazyles operator wiec po prostu z niego skorzystaj z odpowiednimi operandami:

Stonewt a, b;
bool result = a^b;

 

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 3 marca 2018 w C i C++ przez pewien_programista Obywatel (1,070 p.)
0 głosów
1 odpowiedź 507 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez Dawid115 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 12 października 2016 w C i C++ przez alchem Obywatel (1,210 p.)

93,031 zapytań

141,995 odpowiedzi

321,300 komentarzy

62,379 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...