Podsumowanie — kontener generyczny
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 69 z 104.
Wyzwanie
ŁatwyZbudujmy szablon klasy GenericContainer, który łączy wszystko, czego nauczyłeś się o szablonach w tym rozdziale. Utworzysz elastyczny, bezpieczny typowo kontener, który może dynamicznie przechowywać elementy i udostępniać przydatne operacje z wykorzystaniem technik szablonów.
Rozmieścisz swój kod w dwóch plikach:
GenericContainer.h: Zdefiniuj tutaj szablon klasy. TwójGenericContainerpowinien:Dynamicznie przechowywać elementy, używając wskaźnika do tablicy, oraz śledzić bieżący rozmiar i pojemność.
Udostępniać te podstawowe metody:
- Konstruktor, który przyjmuje początkową pojemność
- Destruktor, który prawidłowo zwalnia pamięć dynamiczną
push(T value): dodaje element do kontenera (na potrzeby tego wyzwania przyjmij, że pojemność jest zawsze wystarczająca)get(size_t index): zwraca element o podanym indeksiegetSize(): zwraca bieżącą liczbę elementów
Dodaj szablon funkcji o nazwie
printContainer, który przyjmujeGenericContainer<T>&i wypisuje wszystkie elementy oddzielone spacjami, a na końcu znak nowej linii.Utwórz specjalizację szablonu funkcji
printContainerdlaGenericContainer<bool>, która wypisujetruelubfalsezamiast1lub0.Dodaj wariadyczny szablon funkcji o nazwie
pushAll, który przyjmujeGenericContainer<T>&i dowolną liczbę wartości, dodając każdą z nich do kontenera za pomocą wyrażenia zwijającego.main.cpp: Wczytaj pięć danych wejściowych (każdą w osobnym wierszu):- Pierwszą liczbę całkowitą
- Drugą liczbę całkowitą
- Trzecią liczbę całkowitą
- Wartość typu double
- Wartość logiczną jako ciąg znaków (
truelubfalse)
Zademonstruj działanie swojego kontenera, wykonując następujące czynności:
- Utwórz
GenericContainer<int>o pojemności 10 - Użyj
pushAll, aby dodać wszystkie trzy liczby całkowite jednocześnie - Wypisz rozmiar:
Int container size: <size> - Wywołaj
printContainer, aby wyświetlić liczby całkowite - Utwórz
GenericContainer<double>o pojemności 5 - Dodaj wartość typu double i literał
2.5, używając osobnych wywołańpush - Wywołaj
printContainer, aby wyświetlić wartości typu double - Utwórz
GenericContainer<bool>o pojemności 5 - Dodaj wejściową wartość logiczną i literał
false - Wywołaj
printContainer, aby wyświetlić wartości logiczne (powinno wyświetlićtrue/false)
Na przykład, dla danych wejściowych 10, 20, 30, 3.14 i true:
Int container size: 3
10 20 30
3.14 2.5
true false To wyzwanie łączy szablony klas użyte do utworzenia kontenera, specjalizację szablonu umożliwiającą niestandardowe wypisywanie wartości bool oraz szablony wariadyczne zapewniające elastyczność funkcji pushAll. Kontener sam zarządza własną pamięcią zgodnie z zasadami RAII, pokazując, jak szablony współdziałają z prawidłowym zarządzaniem zasobami.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Wczytaj dane wejściowe
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Przekonwertuj ciąg znaków na bool
bool boolVal = (boolStr == "true");
// TODO: Utwórz GenericContainer<int> o pojemności 10
// TODO: Użyj pushAll, aby dodać wszystkie trzy liczby całkowite naraz
// TODO: Wypisz rozmiar: "Int container size: <size>"
// TODO: Wywołaj printContainer, aby wyświetlić liczby całkowite
// TODO: Utwórz GenericContainer<double> o pojemności 5
// TODO: Dodaj wartość typu double oraz 2.5 za pomocą osobnych wywołań push
// TODO: Wywołaj printContainer, aby wyświetlić wartości typu double
// TODO: Utwórz GenericContainer<bool> o pojemności 5
// TODO: Dodaj wejściową wartość logiczną oraz false
// TODO: Wywołaj printContainer, aby wyświetlić wartości logiczne
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online