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

question-closed Konwersja niejawna obiektów w wyrażeniach (rozkmina)

Object Storage Arubacloud
0 głosów
112 wizyt
pytanie zadane 30 kwietnia 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 1 maja 2018 przez Jakub 0

Witam, jestem mega przybity bo wszystko mi się miesza w temacie metod konwertujących obiekty na inne typy. Mam tego kompletnie dość, nic z tego już nie rozumiem i zacząłem uważać że konwersje niejawne to przeklęte zło ;(

Oto coś takiego:

class KL{
public:
    int a;

    operator int(){ //konwersja obiektu klasy na typ int
        return a;
    }

    friend KL operator+(KL x, KL y){ 
        std::cout<<"operator+()\n";
        return x.a + y.a;
    }


};

int main(){
    KL b;
    b.a = 3; //robię tak bo na potrzeby tego przykładu usunąłem konstruktor
    int c = 4;
    b+c; //nic niczemu nie przypisuje ( chodzi o samo wyrażenie )
}

Mamy jedynie konwersje z obiektu klasy KL na int ( nie odwrotną ), skoro prototyp funkcji przeciążającej wygląda tak:

 friend KL operator+(KL, KL)

To dla 'b+c' gdzie 'b' to obiekt KL a 'c' to typ int nie da się ją zastosować. Nie ma też możliwości wywołania niejawnie żadnego konstruktora by skonwertować 'c' na obiekt KL. Jedyne co pozostało to dokonać konwersji 'b' z typu KL na int. Mogę to napisać nawet jawnie:

(int)b+c;

Po prostu dodajemy teraz dwa int'y. Funkcja przeciążająca operator moim zdaniem nie ma tu nic do rzeczy bo i tak się nie wykona...

Mimo wszystko mam błąd kompilacji:

Nawet jak napiszę:

class KL{
public:
    int a;

    int toInt(){
        return a;
    }

    friend KL operator+(KL x, KL y){
        std::cout<<"operator+()\n";
        return x.a + y.a;
    }


};

int main(){
    KL b;
    b.a = 3; 
    int c = 4;
    b.toInt()+c; 
}

To dalej jest ten sam błąd :/ Ale przecież 'b.toInt()' już ewidentnie symbolizuje wartość int. O co tu chodzi?

Dałem wycinkę bo myślę że widać tu wszystkie szczegóły które bym być może ominą podając samą treść błędu.

Z góry dziękuje za pomoc i pozdrawiam ;)

 

komentarz zamknięcia: już znam wytłumaczenie

1 odpowiedź

+1 głos
odpowiedź 30 kwietnia 2018 przez adrian17 Ekspert (345,160 p.)
wybrane 30 kwietnia 2018 przez Jakub 0
 
Najlepsza

error: could not convert '(x.KL::a + y.KL::a)' from 'int' to 'KL'

Tutaj nie chodzi o `b+c`, ani o Twoją przeciążoną funkcję rzutującą. Chodzi o:

na potrzeby tego przykładu usunąłem konstruktor

i

return x.a + y.a;

Wynikiem dodawania jest `int`. Funkcja ma zwracać `KL`. Nie ma konstruktora `KL(int)`, więc nie ma sposobu żeby zamienić wynik dodawania `int` na `KL`, więc program się nie kompiluje.

komentarz 30 kwietnia 2018 przez Jakub 0 Pasjonat (23,120 p.)
edycja 30 kwietnia 2018 przez Jakub 0

Bardzo dziękuje ;) Faktycznie, przeoczyłem to :/ Pytania nie będę jeszcze zamykał bo w tym temacie ciągle mam jakieś problemy i może jeszcze napiszę jakiś komentarz z dodatkową kwestią. Właściwie już teraz mam małe pytanko:

W książce był taki podkreślony fragment:

To oznacza że gdy mamy taki konstruktor przeciążony operator:

KL operator+(KL b); //składowa klasy

To gdy 'a' i 'b' to obiekty klasy KL, to w wyrażeniu:

a+b;

- Tylko 'b' może być automatycznie rzutowany? 

- Jeśli jednak funkcja przeciążająca nie jest składową klasy tylko np. funkcją zaprzyjaźnioną to i 'a' i 'b' mogą być poddane niejawnej konwersji / rzutowaniu ?

 

1
komentarz 30 kwietnia 2018 przez adrian17 Ekspert (345,160 p.)

To oznacza że gdy mamy taki konstruktor:

(To nie konstruktor)

Jeśli jednak funkcja przeciążająca nie jest składową klasy tylko np. funkcją zaprzyjaźnioną to i 'a' i 'b' mogą być poddane niejawnej konwersji / rzutowaniu ?

Najlepiej samemu sprawdzić i porównać ;) Zobacz co się stanie przy obu wariantach: https://godbolt.org/g/JHttib

komentarz 30 kwietnia 2018 przez Jakub 0 Pasjonat (23,120 p.)

Nie wiem co się ze mną dzieje, ze zmęczenia już mylę nazwy pojęć...

Porównywałem już samemu, wiele razy i dochodzę do wniosku że się zgadza ;).  Ale pytam dla pewności.

Dziękuje za pomoc, trochę dla mnie ciężki ten temat ale jakoś po czasie myślę że to przetrawię. Szkoda tylko że nie mam znajomego programisty co bym mógł go pytać bo na forum to czasami nie wiem jak sprecyzować pytanie bo sam często nawet kompletnie nie rozumiem czego ja nie rozumiem laugh

 

Jak nic jeszcze nie dojdzie to pytanie zamknę jutro....

Podobne pytania

+1 głos
1 odpowiedź 196 wizyt
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 15 kwietnia 2020 w C# przez Adrian1999 Nałogowiec (34,570 p.)
+1 głos
2 odpowiedzi 1,420 wizyt
pytanie zadane 20 grudnia 2017 w JavaScript przez Artek Stary wyjadacz (11,800 p.)

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,004 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!

...