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

szablony jako składowe c++ ?

Object Storage Arubacloud
0 głosów
359 wizyt
pytanie zadane 1 lutego 2017 w C i C++ przez tomek2323 Bywalec (2,050 p.)
edycja 1 lutego 2017 przez Patrycjerz

Witam może ktoś był by tak miły i odpowiedział mi na pytanie czemu

hold<T>q;

hold<int>n;   

są inicjowane   jedno double a drugie intem skoro to są klasy?Skoro to nazwy to czemu?  nie wiem, totalnie tego nie rozumiem pewnie to proste ale siedzę nad tym już gapie się i nie mogę sam na to wpaść poniżej wklejam kod listing 14,20 z książki jezyk c++ szkoła programowania wyd VI;

#include <iostream>
using std::cout;
using std::endl;

template <typename T>
class beta
{
    private:
        template <typename V> // zagnieżdżony szablon klasy jako składowa
            class hold
            {
                private:
                    V val;
                public:
                    hold(V v = 0) : val(v) {}
                    void show() const { cout << val << endl; }
                    V Value() const { return val; }
            };
        hold<T> q; // obiekt szablonu
        hold<int> n; // obiekt szablonu
    public:
        beta( T t, int i) : q(t), n(i) {}
        template<typename U> // metoda szablonu
            U blab(U u, T t) { return (n.Value() + q.Value()) * u / t; }
        void Show() const { q.show(); n.show(); }
};

int main()
{
    beta<double> guy(3.5, 3);
    cout << "T określono jako double\n";
    guy.Show();
    cout << "V najpierw określono jako T, czyli double, a następnie jako int\n";
    cout << guy.blab(10, 2.3) << endl;
    cout << "U określono jako int\n";
    cout << guy.blab(10.0, 2.3) << endl;
    cout << "U określono jako double \n";
    cout << "Koniec\n";
    return 0;
}

3 odpowiedzi

+1 głos
odpowiedź 1 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
 beta<double> guy(3.5, 3);

Myślę że ta linijka powinna być wyjaśnieniem. W miejsce T podstawiane jest double wszedzie tam gdzie występuje

+1 głos
odpowiedź 1 lutego 2017 przez criss Mędrzec (172,590 p.)

Pisz troche składniej, bo ledwo idzie cokolwiek z tego zrozumieć. A kod w pole do kodu (ikonka {...}).

są inicjowane   jedno double a drugie intem skoro to są klasy?

To nie są klasy. To jest szablon klasy. Klasami są hold<int>, hold<double>, hold<whatever>. Kompilator tworzy nową klase (zupełnie niezależny, nowy typ) po prostu wstawiając typ podany w <> wszędzie tam gdzie pojawi się nazwa parametru szablonu (w przypadku hold jest to V) w definicji klasy.

+1 głos
odpowiedź 1 lutego 2017 przez famousghost Początkujący (430 p.)

Spójrz na tę linijkę jakie masz nazwy tych obiektów tego szablony? q i n :)

 

 hold<T> q; // obiekt szablonu
 hold<int> n; // obiekt szablonu

 

A teraz popatrz co robisz w liście inicjalizacyjnej w konstruktorze klasy beta.

beta( T t, int i) : q(t), n(i) {}

masz obiekt n(i) i q(t) czyli dla q jest to typ danych T czyli dowolny podany przy tworzeniu obiektu. Dla drugiego jest to już z góry ustalone przez programistę bo chce on tam widzieć intigera nic więcej jak widać a co do wyników to w tym programie funkcja

U blab(U u, T t) { return (n.Value() + q.Value()) * u / t; }

zwraca typ U czyli zwraca typ pierweszego argumentu.

    cout << guy.blab(10, 2.3) << endl;
    cout << "U określono jako int\n";
    cout << guy.blab(10.0, 2.3) << endl;
    cout << "U określono jako double \n";

dlatego tutaj raz mamy 28 a raz 28.2609 bo poprostu raz zwraca intigera a raz double.

komentarz 1 lutego 2017 przez tomek2323 Bywalec (2,050 p.)
NO dzieki wszystkim za odpowiedzi znam podstawę działania szablonów no nie skojarzyłem że q(t) to wywołanie konstruktora na rzecz obiektu w głowie mialem że to wywołuje tak

hold<double>3.5

a teraz wiem że w konstruktorze beta jest tworzony obiekt q o wartości t

Podobne pytania

0 głosów
1 odpowiedź 762 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
+1 głos
3 odpowiedzi 2,059 wizyt
pytanie zadane 4 czerwca 2015 w C i C++ przez Wiciorny Ekspert (270,190 p.)
0 głosów
1 odpowiedź 401 wizyt
pytanie zadane 14 lutego 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...