Форум: "Основная";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизПереполнение стека при inherited Create; Найти похожие ветки
← →
Прогер (2006-06-26 09:05) [0]Наследование следующее: TComponent, от него TMyClass01, от него TMyClass02, от него TMyClass03. Мои классы в свои конструкторах вызывают inherited Create(...) родителя. В программе создаётся объект класса TMyClass03. В момент Obj:= TMyClass03.Create(...) возникает переполнение стека. При отладке видно, что переполнение возникает при вызове inherited Create в классе TMyClass01. И вот понять не могу, как исправить ошибку... Уведечение памяти под стек приводит к Access Violetion в том же месте кода.
← →
Palladin © (2006-06-26 09:10) [1]декларацию и реализацию конструкторов в студию...
← →
Юрий Зотов © (2006-06-26 09:10) [2]Коструктор вызывает сам себя.
Похоже, где-то пропущено inherited и написано просто Create. Или конструктор вызывает другую процедуру, а та - снова конструктор (возможно, тоже не напрямую).
← →
Прогер (2006-06-26 09:16) [3]В некоторых конструкторах я указывал inherited Create(AOwner, ....), а в некоторых inherited Create(Self, ....). Когда все изменил на inherited Create(AOwner, ....) - всё заработало. Интересно, а почему так?
← →
palva © (2006-06-26 09:37) [4]> Интересно, а почему так?
Это зависит от того, как используются параметры конструктора, а это может сказать автор конструктора или составленная им документация.
← →
Loginov Dmitry © (2006-06-26 11:25) [5]> а в некоторых inherited Create(Self, ....).
Это вообще бредовая идея. Откомпилируйте следующий код и кое-что станет ясно:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyObj = class(TComponent)
public
constructor Create(AOwner: TComponent); override;
end;
TMyObj1 = class(TMyObj)
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyObj }
constructor TMyObj.Create(AOwner: TComponent);
begin
inherited;
Showmessage(IntToStr(Integer(Self)));
end;
constructor TMyObj1.Create(AOwner: TComponent);
begin
inherited;
Showmessage(IntToStr(Integer(Self)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyObj1.Create(Self);
end;
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c