matematykaszkolna.pl
programowanie matrix: Klasa tab[2]; tab[0]= Szkola(); Dlaczego za każdym razem przy przypisaniu do pola tablicy wyświetla się destruktor ? Jest jakiś sposób by to ominąć Wgl jak to wywoływaniem destruktorów przy tablicach? Z góry dzięki za pomoc
5 wrz 17:05
Pytający: Jak rozumiem Szkola jest klasą, która dziedziczy po klasie Klasa (co nie jest zbyt intuicyjne...). Wtedy: tab[0]= Szkola(); działa tak: tworzony jest obiekt tymczasowy typu Szkola (tu masz konstruktor), następnie ten obiekt jest przypisany do tablicy (obiekt tymczasowy jest kopiowany w miejsce tego już istniejącego w tablicy) i w tym miejscu kończy się zakres tego obiektu tymczasowego, więc jest wywołany destruktor. Jak to ominąć? Nie twórz nowych obiektów, a modyfikuj istniejące. Nowy obiekt ⇒ konstruktor ⇒ odpowiadający mu destruktor. Jak to wywoływaniem destruktorów przy tablicach? Normalnie, koniec zakresu: //... { Klasa tab[2]; // 2x konstruktor tab[0]= Szkola(); // konstruktor, destruktor (obiekt tymczasowy) } // 2x destruktor //...
5 wrz 19:27
Dziadek Mróz: Stwórzmy sobie debager tekstowy: https://ideone.com/wBLP9i −−−−− code −−−−− #include <iostream> class Klasa { public: Klasa() { std::cout << "+ Klasa\n"; } ~Klasa() { std::cout << "− Klasa\n"; } }; class Szkola : public Klasa { public: Szkola() { // tutaj wywoła się najpierw Klasa() a później Szkola() std::cout << "+ Szkola\n"; } ~Szkola() { std::cout << "− Szkola\n"; } }; int main() { std::cout << "Klasa tab[2]\n"; Klasa tab[2]; std::cout << "tab[0] = Szkola()\n"; tab[0] = Szkola(); std::cout << "return 0\n"; return 0; } ====== code ===== −−−−− output −−−−− Klasa tab[2] + Klasa + Klasa tab[0] = Szkola() + Klasa + Szkola − Szkola − Klasa return 0 − Klasa − Klasa ===== output ===== Co się stało? 1. Stworzyliśmy statyczną tablicę obiektów Klasa, więc wywołaliśmy 2 konstruktory Klasa() dla tab[0] oraz tab[1], w pamięci mamy [tab[0]:Klasa, tab[1]:Klasa]. Następnie nadpisaliśmy obiektem Szkola tab[0] i wywołaliśmy konstruktor Szkola(), w pamięci mamy [tab[0]:Klasa, tab[1]:Klasa, tab[0]:Klasa, tab[0]:Szkola]. Zakończyliśmy program i musimy wyczyścić pamięć zaczynając od końca: [tab[0]:Klasa, tab[1]:Klasa, tab[0]:Klasa, tab[0]:Szkola] ~Szkola() [tab[0]:Klasa, tab[1]:Klasa, tab[0]:Klasa] ~Klasa() [tab[0]:Klasa, tab[1]:Klasa] ~Klasa() [tab[0]:Klasa] ~Klasa() []
5 wrz 23:14
matrix : Dziękuję bardzo za pomoc
6 wrz 00:00
matrix : A Gdybyśmy mieli tablice wskaźników to przy deklaracji: Klasa *tab[2] , nie wywoła się żaden konstruktor. Dlaczego tak jest
6 wrz 00:09
matrix : Chociaż Ok, musimy po prostu coś przypisać do tego wskaźnika za pomocą new. Jak się deklaruje wskaźnik jakiegoś typu tez nie wywołuje się konstruktor. Dobra myśle ze rozumiem Jeszcze raz dzięki za pomoc
6 wrz 00:18
αβγδπΔΩinnerysuję
Φεθμξρςσφωηϰϱ
±
imię lub nick
zobacz podgląd
wpisz,
a otrzymasz
5^252
2^{10}210
a_2a2
a_{25}a25
p{2}2
p{81}81
Kliknij po więcej przykładów
Twój nick