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

Opus magnum c++ 11 - problem z przykładem w rozdziale o funkcjach wirtualnych

Object Storage Arubacloud
0 głosów
510 wizyt
pytanie zadane 26 lipca 2018 w C i C++ przez taon93 Nowicjusz (120 p.)
edycja 26 lipca 2018 przez taon93
Cześć pierwszy temat na tym forum, nie jestem pewien czy mogę wrzucać zdjęcia z książki więc postaram się ująć mój problem w słowa: Otóż w rozdziale o funkcjach wirtualnych w książce "Opus Magnum c++ 11" Jerzego Grębosza natrafiłem na program, w którym do wektora zawierającego wskaźniki do obiektów klasy podstawowej wysyła się wskaźniki obiektów pochodnych - dziedziczących - na zasadzie konwersji standardowej. Wcześniej w książce było napisane, że nie można stosować takiej praktyki tyle że wysyłając do tablicy/wektora po prostu obiekty, ponieważ rozmiary obiektów mogą się nie zgadzać i będą źle indeksowane. Moje pytanie jest takie: Czy to w książce jest błąd czy taka praktyka jest możliwa do stosowania właśnie jeżeli przesyła się wskaźnik, który co jak co ale przechowuje informacje o wielkości danego obiektu (jeżeli ktoś ma książkę to chodzi mi o stronę 1284 - przykład z ATLASem podpunkt 28). Mam jeszcze jedno pytanie - raczej akademickie ponieważ z tego co dowiedziałem się od kolegi takiej praktyki się nie stosuje: czy jeżeli w jednej klasie mamy zdefiniowany konstruktor oraz operator() i mają takie same argumenty to będą się one wykonywały analogicznie jak w przypadku konstruktora kopiującego i operatora= ; to znaczy przy inicjalizacji wykona się konstruktor a w każdym innym przypadku operator() ?

Z góry dziękuję za odpowiedź. :)

1 odpowiedź

+2 głosów
odpowiedź 26 lipca 2018 przez criss Mędrzec (172,590 p.)

Wcześniej w książce było napisane, że nie można stosować takiej praktyki tyle że wysyłając do tablicy/wektora po prostu obiekty, ponieważ rozmiary obiektów mogą się nie zgadzać i będą źle indeksowane.

Nie można stworzyć tablicy/wektora obiektów różnych typów, bo język na to nie pozwoli. Niezależnie czy są tego samego rozmiaru czy nie. Wskaźnik to zawsze integer o tym samym rozmiarze, więc jak się uprzesz, to możesz w dowolnym kontenerze trzymać wskaźniki na cokolwiek chcesz jednocześnie, ale jako void* (jednak rzadko się zdarza, zeby to miało sens..). Język pozwala na castowanie wskaźnika na klasy pochodne do wskaźnika na klasę bazową, więc możesz trzymać w jednym kontenerze przechowującym typ Base*, typy Derivative1*, Derivative2*, (...).

czy jeżeli w jednej klasie mamy zdefiniowany konstruktor oraz operator() i mają takie same argumenty to będą się one wykonywały analogicznie jak w przypadku konstruktora kopiującego i operatora= ; to znaczy przy inicjalizacji wykona się konstruktor a w każdym innym przypadku operator() ?

Jeśli przy tworzeniu obiektu podasz w nawiasach argumenty, to oczywiście będzie to zrozumiane jako konstruktor. Kiedy obiekt już istnieje (jest jakiś kontekst dla operatora () ), to możesz zawołać operator. Nawet tak:

struct Test
{
    Test(int a) { ++a; }
    int operator()(int a) { return ++a; }
};

int main()
{
    Test(5)(4);
} 

Podobne pytania

0 głosów
0 odpowiedzi 346 wizyt
pytanie zadane 1 kwietnia 2020 w Rozwój zawodowy, nauka, praca przez XiverKi Bywalec (2,050 p.)
0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 26 marca 2020 w C i C++ przez Anahan89 Obywatel (1,270 p.)
0 głosów
1 odpowiedź 1,201 wizyt

92,550 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 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!

...