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