Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2010, 12:27   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
Вопрос Как класс располагается в памяти.

Допустим у нас есть класс:

Код:
Type
 TMClass = class
   private
      fX : integer
   public
      procedure SetX(X : integer);
      construcotr Create;
 end;
Как он будет располагаться в памяти?
VintProg вне форума Ответить с цитированием
Старый 20.06.2010, 14:20   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Никак. Классы - это описание объекта. Также как и любые типы.
Например, как будет располагаться:
Код:
type
     x = record
        Data: Integer;
        Data2: Integer;
     end;
Тоже никак до наступления:
Код:
var
    y: x;
Однако при этом выделяется место под методы класса. Поля же хранятся в конкретных созданных объектах.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.06.2010, 14:32   #3
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А объект как тогда.
VintProg вне форума Ответить с цитированием
Старый 20.06.2010, 14:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сначало указатель на VMT потом поля класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 16:21   #5
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Ну вот.. А я тут хотел об VMT и прочей адресации в лицах рассказать...
Баламут вне форума Ответить с цитированием
Старый 20.06.2010, 16:37   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Ну вот.. А я тут хотел об VMT и прочей адресации в лицах рассказать...
Ну а что ж... Мне бы тоже было интересно послушать...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.06.2010, 20:38   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтож, чую надо писать статью о классах Delphi.
правда сегодня я уже не в состоянии, может начну, но точно не допишу сегодня
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2010, 05:08   #8
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

И каким образом можно вызвать процедуру объекта, не зная структуру?
VintProg вне форума Ответить с цитированием
Старый 21.06.2010, 07:43   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

По имени метода класса. Теоретически можно найти адрес процедуры, но Делфи специально этому препятствует и сделать это в обход стандартных средств проблематично. Хотя если покопаться в литературе о том как создается экземпляр класса (в момент создания объект_класса=ТКласс.Create; и до наступления самого TКласс.Create), возможно существует способ выполнения процедуры без привязки к конкретным полям. Но все это не по-феньшую. Ибо если тебе нужны такие заморочки, то нафига процедуру помещать в класс? Объекты специально ограничивают доступ, чтобы упростить разработку и уменьшить число ошибок. Если Вам срочно нужная эта процедура, сделайте ее в виде обычной процедуры, а не как метод.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 21.06.2010 в 08:01.
Utkin вне форума Ответить с цитированием
Старый 21.06.2010, 08:11   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
вызвать процедуру объекта, не зная структуру?
Да оч просто. как и в классическом паскале можно просто получить адрес этой процедуры:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
 a=class
  procedure aga;
 end;
{ a }

procedure a.aga;
begin
 write('ugu');
end;

var p:procedure;
begin      {$o-}
 p:=@a.aga;
  p;
  readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Дело в том что для обьектов одного и того же класса процедура одна и та же, так что тупо можно поузнавать все адреса полей класса и хачить их по самые помидорки Херсонские
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно выбрать класс вида. KemanSR Общие вопросы C/C++ 1 08.05.2010 20:04
Как описать класс на языке С# ? diliana Помощь студентам 8 20.04.2010 17:01
Как проверить создан ли класс конструктором? Вадим Буренков Общие вопросы Delphi 10 01.07.2009 22:47
Как подключить класс TPowersock =Timur= Компоненты Delphi 1 25.03.2009 08:07