Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
8-1082635528
vin
2004-04-22 16:05
2004.07.11
TImage с быстрым Zoom и Pan


3-1087051839
Sectey
2004-06-12 18:50
2004.07.11
Подключение к MS SQL через ADO


3-1087254139
Older22
2004-06-15 03:02
2004.07.11
Поиск подстроки в строкие для поля БД


6-1084383557
Dimaxx
2004-05-12 21:39
2004.07.11
Исходники для работы с Р2Р


14-1087544162
КаПиБаРа
2004-06-18 11:36
2004.07.11
Пишу рецензию на диплом