![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
На что указывает указатель?
Bolg © (2012-08-31 16:39:00)
var p:pointer
...
p:=TObject;
На что указывает данный указатель?
Bolg (2012-09-01 18:46:00) [1]пасибки
Григорьев Антон (2012-09-01 11:01:00) [2]
> Bolg (31.08.12 19:23) [11]
> Вот именно, он указывает на информацию, на класс. А что
> нужно чтобы создать экземпляр класса? Правильно, нужен класс!
> Вот у нас как раз есть указатель на него, так в чем же
> проблема?
Проблема в том, что кроме указателя на класс нужно знать адрес конструктора, который надо вызвать. Если конструктор у класса статический, его адрес известен только на этапе компиляции. Соответственно, если p:pointer - это указатель на класс TClass1, то конструкция вида
TClass2(p).Create
приведёт к вызову конструктора TClass2.Create, но в качестве ссылки на RTTI (Run-Time Type Information) класса, которая неявно передаётся каждому конструктору, ему будет передана ссылка на RTTI класса TClass1. Ни к чему хорошему это не приведёт, будут ошибки в распределении и заполнении памяти. Так делать не стоит.
Другое дело, если есть класс TClass1, в котором объявлен виртуальный конструктор Create, а потомки его переопределяют. Пусть TClass2 - потомок TClass1, а p:pointer указывает на Class2. Тогда
TClass1(p).Create
приведёт к тому, что в RTTI класса, на который указывает p (т.е. в TClass2) будет найден адрес конструктора Create, которым перекрыт виртуальный TClass1.Create, поэтому будет вызван тот конструктор, который реально соответствует типу p.
Эта конструкция будет нормально работать только в том случае, если TClass2 - наследник TClass1. В остальных случаях возникнут те же проблемы с несоответствием конструктора и RTTI.
Это широко используется в VCL. В TComponent объявлен виртуальный конструктор, поэтому, имея ссылку на любой класс-наследник TComponent, можно создать его экземпляр. Это позволяет коду VCL свободно создавать даже те компоненты, класс которых не был описан во время компиляции модулей VCL.
brother (2012-09-01 08:29:00) [3]> что находится по этому адресу? байты
структура из байтов...
Dimka Maslov (2012-09-01 08:01:00) [4]
> а зачем это ваще надо
Для VCL это надо. В чтобы строить формы с компонентами на основе ресурсов приложения
Bolg (2012-09-01 06:53:00) [5]
> На адрес в памяти и ни на что большее.
что находится по этому адресу? байты
Германн (2012-09-01 02:35:00) [6]
> На что указывает данный указатель?
>
На адрес в памяти и ни на что большее.
turbouser (2012-08-31 21:03:00) [7]Да и вообще не помешало бы кроме хелпа книги Конопки, Рихтера и т.п. поизучать.
Palladin (2012-08-31 20:59:00) [8]Вообще тогда рекомендую изучать в справке конструкцию "class of"
Palladin (2012-08-31 20:58:00) [9]Тип класса - это тоже указатель. На информацию о классе.
Почему указатель не должен присваиваться к указателю?
Bolg (2012-08-31 20:58:00) [10]
> TClass(M[I]).Create;
Гениально!
Bolg (2012-08-31 20:37:00) [11]
> Про полиморфизм слышал?
Да и даже пользуюсь иногда, но зачем присваивать указателю тип класса не понимаю
Rouse_ (2012-08-31 20:36:00) [12]
> Вопрос: как пройтись по массиву и создать экземпляры этих
> классов?
Ну просто пройдись и создай, вот тебе для примера:
program qwe;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils;
var
M: array [0..2] of Pointer;
Instances: array [0..2] of TObject;
I: Integer;
begin
// инициализируем масив классов
M[0] := TObject;
M[1] := TStream;
M[2] := TList;
// создаем экземпляр каждого класса
for I := 0 to 2 do
Instances[I] := TClass(M[I]).Create;
// ну и для проверки, выводим имя каждого созданного класса
for I := 0 to 2 do
writeln(Instances[I].ClassName);
readln;
end.
Inovet (2012-08-31 20:24:00) [13]> [14] Bolg (31.08.12 20:22)
> а зачем это ваще надо?
Про полиморфизм слышал?
Bolg (2012-08-31 20:22:00) [14]
> Не хочешь реальную задачу описать?
Да нету никакой задачи, просто попробовал p:=TObject; скомпилировать, получилось, возник вопрос "а зачем это ваще надо?"
MBo (2012-08-31 20:17:00) [15]>Bolg
Не хочешь реальную задачу описать?
Ega23 (2012-08-31 19:48:00) [16]
> Вот именно, он указывает на информацию, на класс. А что
> нужно чтобы создать экземпляр класса? Правильно, нужен класс!
> Вот у нас как раз есть указатель на него, так в чем же
> проблема?
Ну и в чём проблема-то? Вперде и с песнями!
Bolg (2012-08-31 19:23:00) [17]Вот именно, он указываетна информацию, на класс. А что нужно чтобы создать экземпляр класса? Правильно, нужен класс! Вот у нас как раз есть указатель на него, так в чем же проблема?
Palladin (2012-08-31 19:05:00) [18]Поинтер это 32/64 битное числоозначающее номер байта в плоском массиве памяти. Больше в поинтере никакой информации нет.
Bolg (2012-08-31 18:53:00) [19]
> никак
То есть той информации которая в поинтере недостаточно. Даже учитывая что он указывает на класс? Может быть он указывает на что то другое?
Ega23 (2012-08-31 18:47:00) [20]
> как же быть?
никак