Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизError: class + Constructor + Destructor Найти похожие ветки
← →
VadimKV (2004-06-28 11:45) [0]Первый раз создаю своий клас и объявляю Constructor и Destructor.
Подскажите в чем проблема?
//Класс объявления дерева
TRoot = class
private
{ Private declarations }
public
{ Public declarations }
//Указатели на класс Дерева
UR_Left, //Левый узел
UR_Right: ^TRoot; //Правый узел
Data: Integer;
constructor Create (val : integer);
destructor Destroy;
end;
//Конструктор создания объекта
constructor TRoot.Create (val : integer);
begin ********[Error] UClass.pas(37):
********Identifier redeclared: "TRoot.Create"
UR_Left: = 0;
*****[Error] UClass.pas(38):
Undeclared identifier: "UR_Left"
UR_Right := 0;
**** ...
Data = Val;
end;
//Деструктор объекта
destructor TRoot.Destroy ();
begin
//Очищаем память выделенную под узлы UR_Left и UR_Right
if UR_Left <> 0 then
begin
Dispose (UR_Left);
UR_Left = 0;
end;
if UR_Right <> 0 then
begin
Dispose (UR_Right);
UR_Right = 0;
end;
end;
← →
Sandman25 © (2004-06-28 11:50) [1]Где-то выше есть еще одна реализация этого же конструктора.
← →
Тимохов © (2004-06-28 11:55) [2]1. Ошибки:
1. ДЕструктор должен быть override! Иначе он пустое место.
2. Пустые указатели обозначаются nil, а не 0.
3. Также неплохим стилем (хотя вашем примере нет разницы) в destroy вызывать inherited.
2. По вопросу.
Согласен с ответом 1 - это скорее всего.
← →
PVOzerski © (2004-06-28 12:00) [3]>1. ДЕструктор должен быть override! Иначе он пустое место.
А пояснить нельзя?
← →
Sandman25 © (2004-06-28 12:06) [4]constructor TObject.Create;
begin
end;
destructor TObject.Destroy;
begin
end;
← →
Тимохов © (2004-06-28 12:13) [5]
> PVOzerski © (28.06.04 12:00) [3]
А зачем?
Если я не прав, так и скажите, Дима, ты не прав: деструктор не должен быть override.
> Sandman25 © (28.06.04 12:06) [4]
Мы цитатами будем общаться?
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
← →
Sandman25 © (2004-06-28 12:19) [6][5] Тимохов © (28.06.04 12:13)
Извините, невнимательно изучил Ваше предыдущее сообщение.
ИМХО не нужны слова, если из кода все и так ясно.
← →
PVOzerski © (2004-06-28 12:40) [7]>А зачем?
>Если я не прав, так и скажите, Дима, ты не прав: деструктор не >должен быть override.
Ну, не совсем так. Деструктор не обязан быть override. Однако если он не будет override, то вызываться он будет, только если имя класса будет указано явно.
← →
Sandman25 © (2004-06-28 12:41) [8][7] PVOzerski © (28.06.04 12:40)
Не совсем так. Невиртуальный конструктор никогда не будет вызываться в случае использования Free.
← →
Тимохов © (2004-06-28 12:43) [9]
> PVOzerski © (28.06.04 12:40) [7]
Наверное согласен (наверное, т.к. сам так не деляю).
Как тут говорят некоторые - а надо ли это знать автору вопроса.
Имхо иногда нужно следовать догмам: должен и точка. Когда уровень знаний дойдет до соответствующего уровня сам поймет, что в общем то не должен.
имхо.
← →
Тимохов © (2004-06-28 12:43) [10]
> Не совсем так. Невиртуальный конструктор никогда не будет
> вызываться в случае использования Free.
ну про фрии, скажем никто и не говорил :))))
← →
PVOzerski © (2004-06-28 12:43) [11]>Не совсем так. Невиртуальный конструктор никогда не будет вызываться в случае использования Free.
Это тоже верно. Хотя Free - строго говоря, частный случай. Как, впрочем, и VCL :^)
← →
Sandman25 © (2004-06-28 12:46) [12][10] Тимохов © (28.06.04 12:43)
[11] PVOzerski © (28.06.04 12:43)
AFAIK рекомендуют использовать Free вместо Destroy, причем для всех классов независимо от их принадлежности VCL
← →
Amoeba © (2004-06-28 12:55) [13]
> UR_Right: ^TRoot; //Правый узел
Хороший ляп! Должно быть
UR_Right: TRoot; !!!
А то у тебя получился указатель на указатель.
← →
Sandman25 © (2004-06-28 14:54) [14]Напишите implementation перед constructor TRoot.Create
← →
Тимохов © (2004-06-28 14:57) [15]тогда у и "end." в конце допиши :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c