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 ;)