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

Konwersja między obiektami klas

Ostatnio zmodyfikowano 2013-04-11 20:30
Autor Wiadomość
krissuu
Temat założony przez niniejszego użytkownika
Konwersja między obiektami klas
» 2013-04-08 22:23:49
Witam. Mam pytanie czy możliwa jest konwersja między obiektami klas (poprzez operator przypisania) tzn. obiekt klasy bazowej przypisujemy do obiektu klasy pochodnej i odwrotnie. Jeśli tak to jak to zrobić? Moja klasa:
C/C++
class czlowiek
{
public:
    int wiek, * wsk;
    char plec, imie, nazwisko;
   
    static int licznik;
    czlowiek() { licznik++; }
    ~czlowiek() { licznik--; }
   
    czlowiek operator =( const czlowiek & )
    {
        return * this;
    }
};

class student
    : public czlowiek
{
public:
    int nr_indeksu, semestr;
    char kierunek, wydzial;
};

class prowadzacy
    : public czlowiek
{
public:
    char tytul;
    int ilosc_publikacji;
};

int czlowiek::licznik = 0;
Na razie zadeklarowałem operator przypisania ale zbytnio nie mam pomysłu co dalej... 
P-80238
Monika90
» 2013-04-08 22:45:16
A po co chcesz to robić? Operator przypisania dla obiektów klas należących do hierarchii to pakowanie się w kłopoty.

Klasy mają albo semantykę wartości: mają operator przypisania, konstruktor kopiujący i nie należą do hierarchi, albo mają semantykę referencji: brak operatora przypisania, brak konstruktora kopiującego, należą do hierarchii, mają f. wirtualne i używa się ich przez wskaźniki lub referencje.

Mieszanie tych dwóch rodzajów klas to zadanie dla zaawansowanych.
P-80240
krissuu
Temat założony przez niniejszego użytkownika
» 2013-04-08 22:55:34
Po prostu mam takie polecenie, czy coś takiego jest możliwe i mam to zbadać... Może nie ma to większego znaczenia, chodzi chyba tylko o to czy program się w ogóle skompiluje, czy wywali błąd Znalazłem coś takiego: http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node129.html
Nie wiem czy to do końca o to chodzi...
P-80242
Monika90
» 2013-04-08 23:33:42
Jak chcesz sprawdzić, to sprawdź:
C/C++
struct Base { };

struct Derived
    : Base
{ };

int main()
{
    Base b;
    Derived d;
    b = d; //dziala, ale jest to tzw. slicing - nic dobrego
    static_cast < Base &>( d ) = b; //tez dziala, ale w sumie jest jeszcze gorsze
}
P-80245
krissuu
Temat założony przez niniejszego użytkownika
» 2013-04-08 23:56:04
Ok. Mam coś takiego:
C/C++
czlowiek obiekt3;
student obiekt4;
obiekt3 = obiekt4;
W drugą stronę się nie da, co jest w sumie logiczne, bo klasa student dziedziczy po klasie człowiek. Chciałbym jeszcze się dowiedzieć czym skutkuje taka konwersja i wydaje mi się, że temat będzie wyczerpany i do zamknięcia:)
P-80246
Monika90
» 2013-04-09 11:26:55
W drugą stronę się nie da
Da się w obie strony, tylko Ty nie wiesz jak. I w obie strony kopiowana jest tylko częśc bazowa obiektu, co jest na ogół niepożądane. Dlatego klasa bazowa powinna być abstrakcyjna, albo kopiowanie powinno być wyłączone w całej hierarchii.
P-80256
Hipochondryk
» 2013-04-11 20:25:16
ja bym po prostu przeładował operator = na swoje potrzeby na zewnątrz klas - i po problemie.
P-80397
Hipochondryk
» 2013-04-11 20:30:12
przepraszam za dubel.
masz 3 klasy więc przeładuj operator =  kilka razy dla róznych argumentów, nie korzystaj z domyślnie wygenerowanego przeladowania ponieważ masz wskaźniki, a chyba nie chcemy by jeśli mam dom i Ty zapragniesz mieć identyczny dom tylko z paroma różnicami(dziedziczenie) to burzysz mój i stawiasz w tym samym miejscu - to wlasnie robi domyślnie wygenerowany operator = przez kompilator - tylko kupujesz działkę, i tam stawiasz swój dom. - czyli kopioujesz zawartość wskaźnika a do wskaźnika b, a nie każesz obiektowi B korzystać ze wskaźnika A ponieważ jeśli na wskaźniku dokonasz operacjii to na każdym innym obiekcie to się stanie z automatu.
P-80398
« 1 »
  Strona 1 z 1