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