Destruktor třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Destruktor třídy – C / C++ – Fórum – Programujte.comDestruktor třídy – C / C++ – Fórum – Programujte.com

 

Blujacker
~ Moderátor
0
Grafoman
2. 4. 2011   #1
-
0
-

Ahoj,

udělal jsem si třídu na ukládání souřadnic (x, y). Nepoužívám pole, protože dopředu nevím, jak dlouhý seznam bude a proto používám spojový seznam. Prvky se vkládají metodu Insert(x, y), která vrací *this. Nemusela by sice vracet nic (void Insert), ale pak by nebylo možné zřetězování:



prvek.Insert(x, y).Insert(z, u).Insert()...

V destruktoru pak smažu spojový seznam. Jenže při každém zavolání metody Insert se vytvoří nová instance třídy Coordinates a pak se destruktor zavolá (počet_prvků + 1) krát. A to je samozřejmě špatně, protože už při druhém zavolání destruktoru se třída snaží uvolnit již uvolněnou pamět a to skončí chybou. Pokusil jsem se to obejít tak, že jsem udělal čítač, který inkrementuji vždy, když je zavolána metoda Insert() a dekrementuju, když je zavolán desktruktor. A když je čítač == 1, tak už je zavolán destruktor na poslední instanci a je možné uvolnit alokovanou paměť. Jenže to z nějakého důvodu nefunguje.




#include <iostream>
using namespace std;

typedef struct Coordinate{
int x;
int y;
Coordinate * next;
Coordinate * prev;
} Coordinate;


class Coordinates{
public:
Coordinates();
~Coordinates();
void Erase();
Coordinates Insert(int x, int y);
private:
Coordinate * first;
Coordinate * last;
int length;
Coordinate * curr;
int count;
};


Coordinates Coordinates::Insert(int x, int y){
count ++;
Coordinate * item = new Coordinate;
item->x = x;
item->y = y;
item->next = NULL;

if (first == NULL){
first = item;
curr = first;
last = item;
first->next = NULL;
first->prev = NULL;
length++;
return *this;
}

last->next = item;
item->prev = last;
last = item;
length++;
return *this;
}

Coordinates::Coordinates(){
length = 0;
last = NULL;
first = NULL;
curr = NULL;
count = 0;
}

Coordinates::~Coordinates(){
count--;
if (count == 1){
cout << "mazu" << endl;
Erase();
}
}

void Coordinates::Erase(){
if (first == NULL){
return;
}
Coordinate * temp;
Coordinate * var = first;
while (1){
temp = var;
var = var->next;
delete temp;
if (var == NULL){
break;
}
}
first = NULL;
last = NULL;
curr = NULL;
length = 0;
}

int main(){
Coordinates coordinates;
coordinates.Insert(2, 1).Insert(3, 3);
}



Jak to napravit?

Dík, Jakub

Nahlásit jako SPAM
IP: 88.100.163.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Blujacker
~ Moderátor
0
Grafoman
2. 4. 2011   #2
-
0
-

Tak jsem to vyřešil tak, že po zavolání metody Insert vracím pouze ukazatel. Musím pak zřetězovat



x.Insert()->Insert()->Insert()

, ale to zas tak nevadí..

Nahlásit jako SPAM
IP: 88.100.163.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
ondra.holub+1
Stálý člen
5. 4. 2011   #3
-
0
-

Pokud nechceš kombinovat tečky a šipky, tak použij referenci:

Coordinates& Coordinates::Insert(int x, int y)

Nahlásit jako SPAM
IP: 194.138.12.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý