Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.06 c
15-1337354166
Дуремар
2012-05-18 19:16
2013.03.22
Сломал клаву?


2-1328273809
Pcrepair
2012-02-03 16:56
2013.03.22
Перенос данных из переменной одного типа в переменную другого тип


10-1182237882
Strang
2007-06-19 11:24
2013.03.22
Add-In


15-1336238668
TStas
2012-05-05 21:24
2013.03.22
Нестандартное свойство компонента


9-1192647962
Ricks
2007-10-17 23:06
2013.03.22
Screen-aligned quad





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский