Работа с классами: выбрасывается исключение на push - Free Pascal
Формулировка задачи:
Доброго времени суток.
То ли глаз замылился и я не вижу простую ошибку, то ли я не понимаю, как устроены классы, что вероятнее.
Выбрасывается исключение на push. В момент создания узла node. Причем видимо оба конструктора в TItem мертвы, т.к. исключение генерируется одно и тоже (с поправкой на ветер). Т.е. судя по всему узел не размещается в памяти, а вызов к-ра TObject не спасает.
И простенький мейн, чтобы проверить
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type TItem = class
private
data : integer;
next : TItem;
public
constructor Create(data_ : integer);
constructor Create(data_ : integer; const next_ : TItem);
end;
type
TStack = class
private
top : TItem;
public
constructor Create;
function empty: boolean;
function push(data : integer): boolean;
function pop(var data : integer): boolean;
function pop: boolean;
function pick(var data : integer): boolean;
destructor Done;
end;
implementation
constructor TItem.Create(data_ : integer);
begin
// inherited Create;
data := data_;
next := nil;
end;
constructor TItem.Create(data_ : integer; const next_: TItem);
begin
// inherited Create;
data := data_;
next := next_;
end;
constructor TStack.Create;
begin
top := nil;
end;
function TStack.empty: boolean;
begin
exit(top = nil);
end;
function TStack.push(data : integer): boolean;
var node : TItem;
begin
// node.Create(data, top);
node.Create(data);
node.next := top;
if node = nil then exit(false);
top := node;
exit(true);
end;
function TStack.pop(var data : integer): boolean;
var temp : TItem;
begin
if empty then exit(false);
data := top.data;
temp := top;
top := top.next;
temp.Destroy;
exit(true);
end;
function TStack.pop: boolean;
var temp : TItem;
begin
if empty then exit(false);
temp := top;
top := top.next;
temp.Destroy;
exit(true);
end;
function TStack.pick(var data : integer): boolean;
begin
if empty then exit(false);
data := top.data;
exit(true);
end;
destructor TStack.Done;
begin
while pop do;
end;
end.program project1;
uses unit1;
var store : TStack;
i, num : integer;
begin
store.Create;
for i := 0 to 10 do
begin
if not store.push(i) then break;
store.pick(num);
write(num:5);
end;
writeln;
while not store.empty do
store.pop;
writeln(store.pick(num));
readln;
store.Free;
end.
P.S. Извиняюсь за пунктуацию в заголовке
Решение задачи: «Работа с классами: выбрасывается исключение на push»
textual
Листинг программы
unit u1;
interface
type
TObj1 = class
class constructor Create;
class destructor Destroy;
end;
implementation
class constructor TObj1.Create;
begin
WriteLn('TObj1.Create');
end;
class destructor TObj1.Destroy;
begin
WriteLn('TObj1.Destroy');
end;
initialization
WriteLn('u1 initialization');
finalization
WriteLn('u1 finalization');
end.
Объяснение кода листинга программы
- Объявлен тип TObj1, представляющий класс.
- В классе TObj1 объявлены два метода:
- class constructor TObj1.Create;
- class destructor TObj1.Destroy;
- Реализован метод class constructor TObj1.Create;
- Реализован метод class destructor TObj1.Destroy;
- В разделе initialization вызван метод TObj1.Create;
- В разделе finalization вызван метод TObj1.Destroy;
- Заголовок модуля: unit u1;
- В интерфейсе объявлен тип TObj1;
- В реализации объявлены методы TObj1.Create; и TObj1.Destroy;
- В методе TObj1.Create; выведен текст
TObj1.Create; - В методе TObj1.Destroy; выведен текст
TObj1.Destroy; - В разделе initialization выведен текст
u1 initialization; - В разделе finalization выведен текст
u1 finalization; - Итог: код представляет собой простую программу, которая выводит на консоль информацию о создании и уничтожении объектов класса TObj1.
- Исключение на push не выбрасывается, так как в коде нет операции push.
- Код не содержит ошибок, но и не решает никакой конкретной задачи, кроме вывода информации на консоль.
- В реальной программе для работы с классами в Pascal обычно используются более сложные операции, такие как создание и использование объектов, наследование, полиморфизм и т.д.
- Этот код можно использовать как отправную точку для изучения работы с классами в Pascal.
- Для полноценной работы с классами в Pascal необходимо изучить и использовать другие элементы языка, такие как свойства, методы, наследование и т.д.
- Этот код не решает конкретной задачи, но демонстрирует базовые принципы работы с классами в Pascal.