• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
550 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 466 wizyt
pytanie zadane 1 kwietnia 2020 w Rozwój zawodowy, nauka, praca przez XiverKi Bywalec (2,050 p.)
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 26 marca 2020 w C i C++ przez Anahan89 Obywatel (1,320 p.)
0 głosów
1 odpowiedź 1,263 wizyt

93,334 zapytań

142,328 odpowiedzi

322,406 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...