Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Где-то выше есть еще одна реализация этого же конструктора.


Наверх

Титульная страница Поиск, карта сайта Написать письмо