• 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

0 głosów
174 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 (169,500 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
1 odpowiedź 618 wizyt
0 głosów
2 odpowiedzi 1,609 wizyt
0 głosów
1 odpowiedź 435 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

63,181 zapytań

109,416 odpowiedzi

228,572 komentarzy

42,832 pasjonatów

Przeglądających: 172
Pasjonatów: 11 Gości: 161

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...