Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z funkcją zaprzyjaźnioną

Ostatnio zmodyfikowano 2014-11-15 02:16
Autor Wiadomość
VESPERUS
Temat założony przez niniejszego użytkownika
Problem z funkcją zaprzyjaźnioną
» 2014-11-14 22:32:06
Witam,

Posiadam klasę abstrakcyjną "Klient" oraz klasę "Vip" dziedziczącą po niej. Chciałem zrobić funkcję zaprzyjaźnioną, która będzie modyfikowała zmienne prywatne, które klasa pochodna dziedziczy z abstrakcyjnej. Dodałem więc

C/C++
class Vip
    : public Klient
{
    //nie istotne
private:
    friend void ukradnij( Vip & );

napisałem funkcję

C/C++
void ukradnij( Vip & obiekt )
{
    obiekt.pieniadze = obiekt.pieniadze - 50.00;
}

i okazuje się że funkcja działa tylko gdy tworzę klasę pochodną statycznie

Działa:
C/C++
Vip p1( wektor );
p1.wpisz_dane( "Roman", "Szybki", "Leszno", "11", "22-782", 200.00 );
ukradnij( p1 ); //działa

Nie działa:
C/C++
Klient * p2 = new Vip( wektor );
p2->wpisz_dane( "Krzysztof", "Milski", "Obra", "56", "11-221", 100.00 );
ukradnij( p2 );

W wektorze trzymam wszystkie obiekty,a podaje jako argument w konstruktorze tylko dlatego że potrzebuje go do sprawdzenia pewnych wartości (nie istotne dla tego problemu)
C/C++
vector < Klient *> wektor;

Błąd który otrzymuję to:

main.cpp:59:16: error: invalid initialization of reference of type ‘Vip&’ from expression of type ‘Klient*’
     ukradnij(p2);
                ^
main.cpp:23:7: error: in passing argument 1 of ‘void ukradnij(Vip&)’
  void ukradnij(Vip& obiekt)

Z góry dziękuję za pomoc
P-120617
michal11
» 2014-11-15 02:05:53
Czytaj błędy to będziesz wiedział o co chodzi.
Przekazujesz do funkcji wskaźnik zamiast obiektu. Dodaj gwiazdkę przed p2 i powinno być ok.
P-120629
VESPERUS
Temat założony przez niniejszego użytkownika
» 2014-11-15 02:16:10
Znalazłem rozwiązanie

po pierwsze w klasie abstrakcyjnej trzeba podać że funkcja jest przyjacielem a nie w pochodnych i dodatkowo zmienić referencję na wskaźnik, teraz wszystko działa

C/C++
friend void ukradnij( Klient * );
P-120630
« 1 »
  Strona 1 z 1