Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1087714070
N170
2004-06-20 10:47
2004.07.11
Поздравляю с воскрешением форума. Что это было?


1-1088423856
Masloff
2004-06-28 15:57
2004.07.11
Процедура копирования файла


1-1088441797
NovaPS
2004-06-28 20:56
2004.07.11
Закрытие программы после ошибки


14-1087825949
Terminator
2004-06-21 17:52
2004.07.11
Кто-нибудь в курсе: "Седьмое небо" уже открыли или ещё нет?


1-1088071605
Alek
2004-06-24 14:06
2004.07.11
Изменения в excel ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский