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ąć
![](emots/2/pytajnik.gif)
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
![](emots/2/jezyk1.gif)
Jeszcze
raz dzięki za pomoc
6 wrz 00:18