Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

На что указывает указатель?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.05 c
15-1330339502
Димка На
2012-02-27 14:45
2013.03.22
Смешать два цвета с альфой


15-1335001121
antonn
2012-04-21 13:38
2013.03.22
релюшка на 220


15-1348042361
Просто_Андрей
2012-09-19 12:12
2013.03.22
Какой SSD выбрать


2-1331575099
Дмитрий
2012-03-12 21:58
2013.03.22
Проблема к кеширующим прокси на основе IndyHttpProxyServer


2-1333196241
SKIPtr
2012-03-31 16:17
2013.03.22
управление входящим подключением