• 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
696 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ź 163 wizyt
pytanie zadane 3 marca 2018 w C i C++ przez pewien_programista Obywatel (1,070 p.)
0 głosów
1 odpowiedź 428 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez Dawid115 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 156 wizyt
pytanie zadane 12 października 2016 w C i C++ przez alchem Obywatel (1,210 p.)

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...