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

C++ wywołanie metody z klasy bazowej

Object Storage Arubacloud
0 głosów
1,309 wizyt
pytanie zadane 31 maja 2018 w C i C++ przez Prime_Bull Obywatel (1,820 p.)

Hej. Chciałem stworzyć swoją klasę stosu, która oferowałaby więcej funkcjonalności. Pomyślałem, żeby dziedziczyć z klasy std::stack. Mam jednak problem z wywołaniem metod dziedziczonych np. push().

class Stos : public std::stack<std::string> { 
      // cos tu bedzie 
};

I chciałem wywołać w taki sposób:

Stos s;
s.push(1);

Error:
 

||=== Build: Debug in Alg_Lab12v2 (compiler: GNU GCC Compiler) ===|
C:\Users\przem\Documents\Programming\Alg_Lab12v2\main.cpp||In function 'int main()':|
C:\Users\przem\Documents\Programming\Alg_Lab12v2\main.cpp|75|error: no matching function for call to 'Stos::push(int)'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_stack.h|218|note: candidate: void std::stack<_Tp, _Sequence>::push(const value_type&) [with _Tp = std::__cxx11::basic_string<char>; _Sequence = std::deque<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >; std::stack<_Tp, _Sequence>::value_type = std::__cxx11::basic_string<char>]|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_stack.h|218|note:   no known conversion for argument 1 from 'int' to 'const value_type& {aka const std::__cxx11::basic_string<char>&}'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_stack.h|223|note: candidate: void std::stack<_Tp, _Sequence>::push(std::stack<_Tp, _Sequence>::value_type&&) [with _Tp = std::__cxx11::basic_string<char>; _Sequence = std::deque<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >; std::stack<_Tp, _Sequence>::value_type = std::__cxx11::basic_string<char>]|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_stack.h|223|note:   no known conversion for argument 1 from 'int' to 'std::stack<std::__cxx11::basic_string<char> >::value_type&& {aka std::__cxx11::basic_string<char>&&}'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Pomyślałem, żeby zrobić coś takiego, ale nie działa:
 

Stos s;
s.std::stack<std::string>::push(1);

 

1
komentarz 31 maja 2018 przez mokrowski Mędrzec (155,460 p.)
Oprócz błędu który już został pokazany, istnieje niebezpieczeństwo że wpakujesz się w problemy. Dziedziczenie z kontenera nie posiadającego wirtualnego destruktora (a ten w bibliotece standardowej go nie ma), może skazać program na niezdefiniowane zachowanie przy mało uważnym programowaniu.
komentarz 31 maja 2018 przez Prime_Bull Obywatel (1,820 p.)

Masz na myśli wycieki pamięci, tak jak jest to omówione w tym filmie?
https://www.youtube.com/watch?v=jELbKhGkEi0

Skoro mogą być wycieki pamięci to dlaczego twórcy biblioteki standardowej nie zastosowali wirtualnych destruktorów? Nie zakładali, że klasy będą dziedziczone?

1
komentarz 31 maja 2018 przez mokrowski Mędrzec (155,460 p.)
Tak. Nie zakładali że klasy będą dziedziczone. W przeciwnym wypadku, nie wykorzystując dziedziczenia, płacił byś cenę za wirtualny destruktor. Poza tym lepsze jest zawieranie od dziedziczenia.
komentarz 1 czerwca 2018 przez Prime_Bull Obywatel (1,820 p.)
Szczerze mówiąc to od niedawna programuję obiektowo i miałem właśnie problem z dobrym połączeniem klas jeśli chodzi o dziedziczenie, dopiero później wpadłem na pomysł, że zacznę tworzyć obiekty klas w innych klasach. Czyli można by rzec, że nieświadomie używałem zawierania czy tam kompozycji, prawda?
1
komentarz 1 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)

Zawieranie to inaczej Agregacja. Jeśli obiekt klasy zawierającej jest niszczony, obiekty klas zawieranych (agregowanych), nie są niszczone i przetrwają.

Kompozycja to zawieranie ścisłe. Jeśli obiekt klasy komponującej jest niszczony, obiekty klas zawieranych (wkomponowanych), są niszczone i nie przetrwają.

Używałeś zapewne jednego z nich.

Po prostu nie podniecaj się dziedziczeniem bo oprócz wielu zalet (np. łatwości wytłumaczenia jak to działa), tworzy często zbyt twarde "spawy w kodzie". Następnie nie użyjesz ponownie kodu jakiejś klasy jeśli nie wyciągniesz także jej rodziców. Powodem będzie "zespawanie" poprzez dziedziczenie. To taka relacja która nie powinna być wybierana "jak nie wiem co to dziedziczenie".... Raczej z dużą rozwagą...

komentarz 1 czerwca 2018 przez Prime_Bull Obywatel (1,820 p.)
Dzięki wielkie za wartościowe odpowiedzi!

1 odpowiedź

+1 głos
odpowiedź 31 maja 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 31 maja 2018 przez Prime_Bull
 
Najlepsza

std::stack<std::string> to jest stos napisów, więc nie można odkładać na niego liczb typu int, gdybyś odkładał stringi to by zadziałało bez problemu.

    Stos s;
    s.push("123");

 

komentarz 31 maja 2018 przez Prime_Bull Obywatel (1,820 p.)
Wiedziałem, że zrobiłem gdzieś głupi błąd haha

Podobne pytania

0 głosów
1 odpowiedź 699 wizyt
pytanie zadane 18 lutego 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
+1 głos
2 odpowiedzi 398 wizyt
pytanie zadane 21 października 2021 w C# przez Kamirru9 Początkujący (300 p.)
0 głosów
4 odpowiedzi 717 wizyt

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!

...