• 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
202 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 (171,460 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ź 693 wizyt
0 głosów
2 odpowiedzi 2,119 wizyt
0 głosów
1 odpowiedź 440 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

67,017 zapytań

113,930 odpowiedzi

241,411 komentarzy

46,960 pasjonatów

Przeglądających: 150
Pasjonatów: 2 Gości: 148

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.

...