Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизКонструкторы и статические методы. Найти похожие ветки
← →
Макс Реалов (2004-02-25 15:22) [0]Я создаю класс и наследуюсь от класса, конструктор которого - статический метод (к примеру TRegistry или TObject).
(кстати, в справке Delphi написанно, что метод Create у TRegistry override, а компилятро говорит - static и в исходничках статический - хиловато сравочка у вас сделана ;)
Так вот,- когда отрабатывает статический конструктор класса-предка?
Пример:
TTest = class(TObject)
private
public
end;
TTest2 = class(TTest)
public
constructor Create; virtual;
end;
...
constructor TTest2.Create;
begin
cout << "TTest2 Create";
end;
Когда будет выполнен статический конструктор класса TTest?
← →
Skier (2004-02-25 15:28) [1]>Макс Реалов (25.02.04 15:22)
> Когда будет выполнен статический конструктор класса TTest?
передcout << "TTest2 Create";
← →
Skier (2004-02-25 15:28) [2]а вообще зачем тебе это всё ?
← →
Тимохов (2004-02-25 15:33) [3]
> Макс Реалов (25.02.04 15:22)
В твоем примере никогда, т.к. ты его не вызываешь.
← →
Skier (2004-02-25 15:36) [4]>Тимохов © (25.02.04 15:33) [3]
у TTest нет своего конструктора.
← →
Тимохов (2004-02-25 15:40) [5]
> Skier © (25.02.04 15:36) [4]
> >Тимохов © (25.02.04 15:33) [3]
> у TTest нет своего конструктора.
Это к чему?
Своего нет, но есть пришедший от TObject, который пустой.
Вопрос то был когда в примере автора выполнится конструктор, я ответил, никогда. Вроде я ничего такого неверного не сказал.
← →
Макс Реалов (2004-02-25 15:42) [6]>> Skier © (25.02.04 15:28):
вот и я так подумал, но под отладчиком когда я такую ситуацию модулирую,- не получается зайти в процедуру создания родительского класса.
Зачем надо - долго объяснять.
...хотя, вот, пример придумал:
Надо инициализировать поля класса, порождённого от TObject, при его создании. Можно конечно в AfterConstruction это сделать, но зачем, если есть специальное место - конструктор? А Create у TObject не виртуальный, а мне этому классу надо конструктор виртуальный сделать. Вот я и беспокоюсь ;)
Хотя на самом деле просто интересно.
>> Тимохов © (25.02.04 15:33):
:))) ага, конечно. А как, по-твоему, все классы в Delphi реализованы? Они ведь ВСЕ от TObject"а порождены. А у него конструктор, извините, статический. Так что, батенька, не надо ля-ля. А если бы было так как ты говоришь - то грош цена всему вашему VCL"ю бы был :)
← →
Макс Реалов (2004-02-25 15:44) [7]хотя может я чего в объектной структуре Delphi не догоняю :)
← →
Тимохов (2004-02-25 15:45) [8]
> Макс Реалов (25.02.04 15:42) [6]
Что-то я про "ля-ля" не понял.
Ты задал вопрос, я тебе ответил. Я не прав?
Судя по уровню твоих вопросов ты ответить прав ли я не можешь. Так что будем ждать опытных товарищей.
Судя по твоему комментарию skier"у ты немного не догоняешь работу с классами и объектами. При чем тут afterconstuction? Инициализируй поля в конструкторе и дело с концом. В чем вопрос то?
← →
Skier (2004-02-25 15:46) [9]>Макс Реалов (25.02.04 15:42) [6]
Хм...а ты думаешь в Borland-e дураки сидят. :)
конструктор TObject специально сделан статическим чтобы
адрес конструктора базового класса был бы известен на этапе компиляции.
← →
Тимохов (2004-02-25 15:46) [10]Зачем тебе виртуальный конструктор у TObject?
← →
Тимохов (2004-02-25 15:49) [11]
> Skier © (25.02.04 15:46) [9]
Вы это откуда взяли? Это домыслы или подтвержденная информация?
← →
Макс Реалов (2004-02-25 15:54) [12]>> Skier © (25.02.04 15:46):
хех... разумно-разумно.
Ладно, сейчас в CPU гляну. Никуда не денется - всю правду покажет ;)
>> Тимохов © (25.02.04 15:45):
"При чем тут afterconstuction? Инициализируй поля в конструкторе и дело с концом. В чем вопрос то?"
См. Макс Реалов (25.02.04 15:42) [6].
либо я формулирую коряво, либо ты понимаешь коряво, либо одно из двух ;) Без обид, но твоё "Инициализируй поля в конструкторе " вынуждает меня ждать "опытных товарищей" :)
← →
Тимохов (2004-02-25 15:56) [13]
> Макс Реалов (25.02.04 15:54) [12]
Еще третье возможно - ты книжички по дельфи забыл почитать.
← →
Макс Реалов (2004-02-25 15:56) [14]Тимохов © (25.02.04 15:49) [11]:
8))))))))))))))))
Respect for Delphi programmers 8))
All methods are static unless you specify otherwise when you declare them. Static methods work like regular procedures or functions. The compiler determines the exact address of the method and links the method at compile time.
Это ваш help. 8)
← →
Тимохов (2004-02-25 15:57) [15]
> Макс Реалов (25.02.04 15:42) [6]
> вот и я так подумал, но под отладчиком когда я такую ситуацию
> модулирую,- не получается зайти в процедуру создания родительского
> класса.
Конечно не получится, ты же родительский конструктор не вызываешь, вот потому и не заходишь.
Ты что - сишник?
← →
Тимохов (2004-02-25 15:59) [16]
> Макс Реалов (25.02.04 15:56) [14]
Это то здесь причем?
Все верно написано.
Как это относится к тому, что Вы говорили раньше?
Что Вас смущает в жирной фразе?
← →
Skier (2004-02-25 15:59) [17]TTest2 = class(TTest)
private
FField1 : Integer;
FField2 : String;
public
constructor Create; virtual;
end;
...
constructor TTest2.Create;
begin
FField1 := 123;
FField2 := "Hello, world !";
end;
И всё...
← →
Макс Реалов (2004-02-25 15:59) [18]>>Тимохов © (25.02.04 15:56) [13]:
А что - по Delphi ещё и книжки есть? 8)
Ладно - флудить начали.
На самом деле Delphi - big respect! Просто когда на него резко пересаживают - тут уж не до книжек,- работу делать надо :|
А ООП я вообще не занимался до этого :/
← →
KSergey (2004-02-25 16:00) [19]> [1] Skier © (25.02.04 15:28)
> > Когда будет выполнен статический конструктор класса TTest?
> перед cout << "TTest2 Create";
Чета я нифига не понимаю, товарисчи...
А разве без inherited в методе (в частности - в конструкторе) вызывается метод (конструктор) предка? Или это такое хитрое поведение именно конструкторов??
Я как-то всегда считал, что для статических методов вызывается тот метод, для которого класса я его вызываю - и все! Если там есть inherited - да, пожалуйста, вызовется и предка, а иначе - не вызовется. Разве это не так??
← →
Тимохов (2004-02-25 16:01) [20]
> Макс Реалов (25.02.04 15:59) [18]
> Ладно - флудить начали.
В общем-то согласен - почти флуд.
Если есть вопросы - задавай.
← →
Skier (2004-02-25 16:01) [21]>Макс Реалов (25.02.04 15:54) [12]
> Ладно, сейчас в CPU гляну
Чтобы всё увидеть нужно будет включить галку Use Debug DCUs
← →
Тимохов (2004-02-25 16:01) [22]
> KSergey © (25.02.04 16:00) [19]
Все правильно вы понимаете.
← →
Skier (2004-02-25 16:03) [23]
> А разве без inherited в методе (в частности - в конструкторе)
> вызывается метод (конструктор) предка?
В данном случае вызовется конструктор TObject.
← →
Макс Реалов (2004-02-25 16:03) [24]>> Skier © (25.02.04 15:59):
...ну да. Так я и сделал :)
>>Тимохов:
я не "сишник" - боже упаси :) про логическое программирование слыхал - вот из тех краёв :)
Всем спасиб.!
← →
default (2004-02-25 16:04) [25]KSergey © (25.02.04 16:00) [19]
"Я как-то всегда считал, что для статических методов вызывается тот метод, для которого класса я его вызываю - и все!"
конечно так это, не воспринимай всерьёз
Макс Реалов (25.02.04 15:59) [18]
"А ООП я вообще не занимался до этого :/"
← →
Тимохов (2004-02-25 16:04) [26]
> Skier © (25.02.04 16:03) [23]
В каком данном случае?
В оригинальном вопросе вроде вообще вызова конструктора не было.
← →
KSergey (2004-02-25 16:05) [27]> [6] Макс Реалов (25.02.04 15:42)
Я никак не пойму, что мешает проинициализировать поля в конструкторе? Религия? Других причин я не вижу ;) Вот и [17] Skier © (25.02.04 15:59)подсказывает. Только я не пойму какая при этом разница: виртуальный сей конструкторо или нет??
> [15] Тимохов © (25.02.04 15:57)
> Ты что - сишник?
Судя по вот этому - еще хуже: си плюс-плюсник ;)
> cout << "TTest2 Create ";
← →
KSergey (2004-02-25 16:11) [28]> [23] Skier © (25.02.04 16:03)
> В данном случае вызовется конструктор TObject.
А это почему, интересно?
К стати, если уж придираться - то нифига пока не вызовается - нет кода создания объекта. Или я не прав?
Впрочем, может здесь имеется в виду то, что конструктор объекта TObject есть как бы по сути код создания самого объекта (включая выделение пемяти)- может в этом смысле конструктор TObject вызовется первым? Хотя что-то не уверен я в том... Вроде "конструктор объектов" вообщще - он, как я понимаю, как бы вне этой всей фигни... Хотя - как знать...
← →
Skier (2004-02-25 16:12) [29]
> Впрочем, может здесь имеется в виду то, что конструктор
> объекта TObject есть как бы по сути код создания самого
> объекта (включая выделение пемяти)- может в этом смысле
> конструктор TObject вызовется первым?
Именно так.
← →
Тимохов (2004-02-25 16:13) [30]
> KSergey © (25.02.04 16:11) [28]
Конструктор вообще мало чем отличается от обыкновенного метода.
Основное отличие это ключевое слова constructor, которое заставляет сделать вызов NewInstance, где и выделяется память.
← →
Тимохов (2004-02-25 16:18) [31]
> Skier © (25.02.04 16:12) [29]
Create сам не вызывается... :((((
Сам вызывается только newinstance
← →
Skier (2004-02-25 16:24) [32]ты меня достал ! :)
вот что вызовется
function _ClassCreate(AClass: TClass; Alloc: Boolean): TObject;
asm
{ -> EAX = pointer to VMT }
{ <- EAX = pointer to instance }
PUSH EDX
PUSH ECX
PUSH EBX
TEST DL,DL
JL @@noAlloc
CALL dword ptr [EAX].vmtNewInstance //вот это и есть вызов newinstance.
@@noAlloc:
{$IFNDEF PC_MAPPED_EXCEPTIONS}
XOR EDX,EDX
LEA ECX,[ESP+16]
MOV EBX,FS:[EDX]
MOV [ECX].TExcFrame.next,EBX
MOV [ECX].TExcFrame.hEBP,EBP
MOV [ECX].TExcFrame.desc,offset @desc
MOV [ECX].TexcFrame.ConstructedObject,EAX { trick: remember copy to instance }
MOV FS:[EDX],ECX
{$ENDIF}
POP EBX
POP ECX
POP EDX
RET
{$IFNDEF PC_MAPPED_EXCEPTIONS}
@desc:
JMP _HandleAnyException
{ destroy the object }
MOV EAX,[ESP+8+9*4]
MOV EAX,[EAX].TExcFrame.ConstructedObject
TEST EAX,EAX
JE @@skip
MOV ECX,[EAX]
MOV DL,$81
PUSH EAX
CALL dword ptr [ECX].vmtDestroy
POP EAX
CALL _ClassDestroy
@@skip:
{ reraise the exception }
CALL _RaiseAgain
{$ENDIF}
end;
← →
Тимохов (2004-02-25 16:28) [33]
> Skier © (25.02.04 16:24) [32]
Я помню, про Вас АП или panov (не помню точно) сказал, что вы обычно ведете себя корректно.
В данном случае вы меня тоже достали.
Вы мне не тыкайте кодом. Я его и так знаю.
Я возразил вашему высказыванию
---------------
> Впрочем, может здесь имеется в виду то, что конструктор
> объекта TObject есть как бы по сути код создания самого
> объекта (включая выделение пемяти)- может в этом смысле
> конструктор TObject вызовется первым?
Именно так.
---------------
Вы продолжаете утвержать "Именно так", на вопрос фразу "может в этом смысле конструктор TObject вызовется первым"?
← →
Тимохов (2004-02-25 16:31) [34]
> Skier © (25.02.04 16:24) [32]
И вообще про что речь?
В исходном вопросе нет вообще вызова конструктора.
Для плодотворного обсуждения надо понять из каких условий мы вообще исходим.
Я так понимаю, что весь сыр-бор из за вашего ответа 1. Вы продолжаете утвержать, что ответ 1 является правилным на вопрос "Когда будет выполнен статический конструктор класса TTest?"?
← →
Skier (2004-02-25 16:32) [35]>Тимохов © (25.02.04 16:28) [33]
ты просто цепляешься к словам и продолжать в этом же духе у меня нет никакого желания...
← →
Игорь Шевченко (2004-02-25 16:34) [36]Тимохов © (25.02.04 16:28)
Вы еще подеритесь, горячие финские парни. Посмотрите, во что компилируется ваш код, и будет вам счастье даром.
← →
Тимохов (2004-02-25 16:34) [37]
> Skier © (25.02.04 16:32) [35]
При всем моем большом уважении к вашему цвету, это второй раз когда я вас пытаюсь поправить на либо случайно, либо намеренно оброненную некорректную фразу.
Нет, я не цепляюсь к словам.
В данном случае есть некорректное высказываение.
Ваше дело признавать это или нет (в прошлый раз вы это не признали).
← →
Тимохов (2004-02-25 16:35) [38]
> Игорь Шевченко © (25.02.04 16:34) [36]
Я русский.
Повторю
"И вообще про что речь?
В исходном вопросе нет вообще вызова конструктора.
Для плодотворного обсуждения надо понять из каких условий мы вообще исходим."
← →
Skier (2004-02-25 16:36) [39]>Тимохов © (25.02.04 16:34) [37]
> в прошлый раз вы это не признали
Про Dispose мне нечего было признавать.
Ибо неправ был именно ты.
А вообще ты забавен...:)
← →
KSergey (2004-02-25 16:43) [40]> [32] Skier © (25.02.04 16:24)
А что, вызов NewInstance и конструктора TObject - это одно и тоже?? Ой ли?
Страницы: 1 2 3 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.013 c