Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизНа что указывает указатель? Найти похожие ветки
← →
Bolg (2012-08-31 16:39) [0]
var p:pointer
...
p:=TObject;
На что указывает данный указатель?
← →
Ega23 © (2012-08-31 16:51) [1]На класс.
← →
Bolg (2012-08-31 17:12) [2]Есть массив
m:array[1..100] of pointer;
заполненный классами.
Вопрос: как пройтись по массиву и создать экземпляры этих классов?
← →
sniknik © (2012-08-31 17:21) [3]"пройтись" циклом, создать... нужно знать какого класса твой абстрактный указатель (в нем не хранится, а по самому указателю пусто, экземпляр не создан).
p.s. как только решишь проблему узнавания класса по указателю, тут же при ступай к созданию супер архиватора, который все что угодно жмет в 1 байт (хотя... это легко), ну раз архиватора. задачи одного плана.
← →
Palladin © (2012-08-31 17:23) [4]На поставленный в такой формулировке вопрос ответа не существует.
← →
Bolg (2012-08-31 17:29) [5]
> нужно знать какого класса твой абстрактный указатель (в нем не хранится
>На что указывает?
> На класс.
Вот и взять тип класса из указателя, он же на что то указывает?
← →
Ega23 © (2012-08-31 18:24) [6]
> Вот и взять тип класса из указателя, он же на что то указывает?
TMyClass = class (TObject)
public
constructor Create; virtual;
end;
TMyClassClass = class of TMyClass;
← →
Bolg (2012-08-31 18:42) [7]А дальше?
TMyClassClass(m[i]).Create
Так?
Но классов разных много в массиве, как же быть?
← →
Ega23 © (2012-08-31 18:47) [8]
> как же быть?
никак
← →
Bolg (2012-08-31 18:53) [9]
> никак
То есть той информации которая в поинтере недостаточно. Даже учитывая что он указывает на класс? Может быть он указывает на что то другое?
← →
Palladin © (2012-08-31 19:05) [10]Поинтер это 32/64 битное число означающее номер байта в плоском массиве памяти. Больше в поинтере никакой информации нет.
← →
Bolg (2012-08-31 19:23) [11]Вот именно, он указывает на информацию, на класс. А что нужно чтобы создать экземпляр класса? Правильно, нужен класс! Вот у нас как раз есть указатель на него, так в чем же проблема?
← →
Ega23 © (2012-08-31 19:48) [12]
> Вот именно, он указывает на информацию, на класс. А что
> нужно чтобы создать экземпляр класса? Правильно, нужен класс!
> Вот у нас как раз есть указатель на него, так в чем же
> проблема?
Ну и в чём проблема-то? Вперде и с песнями!
← →
MBo © (2012-08-31 20:17) [13]>Bolg
Не хочешь реальную задачу описать?
← →
Bolg (2012-08-31 20:22) [14]
> Не хочешь реальную задачу описать?
Да нету никакой задачи, просто попробовал p:=TObject; скомпилировать, получилось, возник вопрос "а зачем это ваще надо?"
← →
Inovet © (2012-08-31 20:24) [15]> [14] Bolg (31.08.12 20:22)
> а зачем это ваще надо?
Про полиморфизм слышал?
← →
Rouse_ © (2012-08-31 20:36) [16]
> Вопрос: как пройтись по массиву и создать экземпляры этих
> классов?
Ну просто пройдись и создай, вот тебе для примера: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.
← →
Bolg (2012-08-31 20:37) [17]
> Про полиморфизм слышал?
Да и даже пользуюсь иногда, но зачем присваивать указателю тип класса не понимаю
← →
Bolg (2012-08-31 20:58) [18]
> TClass(M[I]).Create;
Гениально!
← →
Palladin © (2012-08-31 20:58) [19]Тип класса - это тоже указатель. На информацию о классе.
Почему указатель не должен присваиваться к указателю?
← →
Palladin © (2012-08-31 20:59) [20]Вообще тогда рекомендую изучать в справке конструкцию "class of"
← →
turbouser © (2012-08-31 21:03) [21]Да и вообще не помешало бы кроме хелпа книги Конопки, Рихтера и т.п. поизучать.
← →
Германн © (2012-09-01 02:35) [22]
> На что указывает данный указатель?
>
На адрес в памяти и ни на что большее.
← →
Bolg (2012-09-01 06:53) [23]
> На адрес в памяти и ни на что большее.
что находится по этому адресу? байты
← →
Dimka Maslov © (2012-09-01 08:01) [24]
> а зачем это ваще надо
Для VCL это надо. В чтобы строить формы с компонентами на основе ресурсов приложения
← →
brother © (2012-09-01 08:29) [25]> что находится по этому адресу? байты
структура из байтов...
← →
Григорьев Антон © (2012-09-01 11:01) [26]
> 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.
← →
Bolg (2012-09-01 18:46) [27]пасибки
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.108 c