Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

На что указывает указатель?


Страницы:   1 2

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]


>  как же быть?

никак


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо