![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Error: class + Constructor + Destructor [D7, Win95/98]
VadimKV © (2004-06-28 11:45:00)Первый раз создаю своий клас и объявляю 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;
Тимохов (2004-06-28 14:57:00) [1]тогда у и "end." в конце допиши :)
Sandman25 (2004-06-28 14:54:00) [2]Напишите implementation перед constructor TRoot.Create
Amoeba (2004-06-28 12:55:00) [3]
> UR_Right: ^TRoot; //Правый узел
Хороший ляп! Должно быть
UR_Right: TRoot; !!!
А то у тебя получился указатель на указатель.
Sandman25 (2004-06-28 12:46:00) [4][10] Тимохов © (28.06.04 12:43)
[11] PVOzerski © (28.06.04 12:43)
AFAIK рекомендуют использовать Free вместо Destroy, причем для всех классов независимо от их принадлежности VCL
Тимохов (2004-06-28 12:43:00) [5]
> PVOzerski © (28.06.04 12:40) [7]
Наверное согласен (наверное, т.к. сам так не деляю).
Как тут говорят некоторые - а надо ли это знать автору вопроса.
Имхо иногда нужно следовать догмам: должен и точка. Когда уровень знаний дойдет до соответствующего уровня сам поймет, что в общем то не должен.
имхо.
Тимохов (2004-06-28 12:43:00) [6]
> Не совсем так. Невиртуальный конструктор никогда не будет
> вызываться в случае использования Free.
ну про фрии, скажем никто и не говорил :))))
PVOzerski (2004-06-28 12:43:00) [7]>Не совсем так. Невиртуальный конструктор никогда не будет вызываться в случае использования Free.
Это тоже верно. Хотя Free - строго говоря, частный случай. Как, впрочем, и VCL :^)
Sandman25 (2004-06-28 12:41:00) [8][7] PVOzerski © (28.06.04 12:40)
Не совсем так. Невиртуальный конструктор никогда не будет вызываться в случае использования Free.
PVOzerski (2004-06-28 12:40:00) [9]>А зачем?
>Если я не прав, так и скажите, Дима, ты не прав: деструктор не >должен быть override.
Ну, не совсем так. Деструктор не обязан быть override. Однако если он не будет override, то вызываться он будет, только если имя класса будет указано явно.
Sandman25 (2004-06-28 12:19:00) [10][5] Тимохов © (28.06.04 12:13)
Извините, невнимательно изучил Ваше предыдущее сообщение.
ИМХО не нужны слова, если из кода все и так ясно.
Тимохов (2004-06-28 12:13:00) [11]
> 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:06:00) [12]constructor TObject.Create;
begin
end;
destructor TObject.Destroy;
begin
end;
PVOzerski (2004-06-28 12:00:00) [13]>1. ДЕструктор должен быть override! Иначе он пустое место.
А пояснить нельзя?
Тимохов (2004-06-28 11:55:00) [14]1. Ошибки:
1. ДЕструктор должен быть override! Иначе он пустое место.
2. Пустые указатели обозначаются nil, а не 0.
3. Также неплохим стилем (хотя вашем примере нет разницы) в destroy вызывать inherited.
2. По вопросу.
Согласен с ответом 1 - это скорее всего.
Sandman25 (2004-06-28 11:50:00) [15]Где-то выше есть еще одна реализация этого же конструктора.