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

Вниз

Указатель на самого себя.   Найти похожие ветки 

 
@!!ex ©   (2007-10-10 16:14) [0]

Как можно получить в методе класса указатель на экземпляр для которого этот метод вызван?


 
Суслик ©   (2007-10-10 16:15) [1]

нет


 
Иванов   (2007-10-10 16:15) [2]

Self.


 
TUser ©   (2007-10-10 16:15) [3]

Self


 
Иванов   (2007-10-10 16:16) [4]

Добавление - если это не классовый метод.


 
Palladin ©   (2007-10-10 16:16) [5]

никак


 
Суслик ©   (2007-10-10 16:17) [6]

если речь идет про class procedure?
про это же идет речь? если да, то self - это ссылка на класс, а не на экземпляр.


 
@!!ex ©   (2007-10-10 16:18) [7]

> [2] Иванов   (10.10.07 16:15)


> [3] TUser ©   (10.10.07 16:15)


procedure TCamera.SetCamera;
begin
 ...
 ActiveCamera:=@Self;
end;

ActiveCamera - не валидный указатель.


 
Суслик ©   (2007-10-10 16:18) [8]

:) тогда просто self


 
@!!ex ©   (2007-10-10 16:19) [9]

Жаль... Спасибо.


 
Иванов   (2007-10-10 16:19) [10]

> Суслик ©   (10.10.07 16:17) [6]

Речь идет о методе класса (см. сабж), а не о классовом методе.


 
@!!ex ©   (2007-10-10 16:19) [11]

> [8] Суслик ©   (10.10.07 16:18)

Просто Self - не указатель...


 
Суслик ©   (2007-10-10 16:20) [12]


>  [10] Иванов   (10.10.07 16:19)
> > Суслик ©   (10.10.07 16:17) [6]

давай не будем спорить о терминологии, ибо ее устоявшейся все же нет.
метод класса можено понять при прочих равных и как class procedure.
к тому же автор не первый день пишет на дельфи (вроде) и такую очевидную весч спрашивать бы не стал.


 
Суслик ©   (2007-10-10 16:21) [13]

сущай автор, привел бы ты код
тебя не пойщем чессо слово, что тебе надо.


 
Иванов   (2007-10-10 16:21) [14]

> @!!ex ©   (10.10.07 16:19) [11]

Просто Self - это именно указатель. И именно на экземпляр класса. Никаких @ не требуется.


 
Иванов   (2007-10-10 16:25) [15]

> Суслик ©   (10.10.07 16:20) [12]

Тем более прискорбно. Особенно, после [11].


 
Ins ©   (2007-10-10 16:25) [16]


> Просто Self - это именно указатель. И именно на экземпляр
> класса. Никаких @ не требуется.

Естественно.


 
Иванов   (2007-10-10 16:27) [17]

> Ins ©   (10.10.07 16:25) [16]

До сих пор и мне так казалось...


 
@!!ex ©   (2007-10-10 16:27) [18]


> к тому же автор не первый день пишет на дельфи (вроде) и
> такую очевидную весч спрашивать бы не стал.

На дельфи хоть и давно пишу, с необходистью такое делать - не сталкивался, так что могу и глупость спрашивать, тем более, что знания ООП(как выяснилось) существенно ниже, чем хотелось бы.

Суть в том, что есть куча камер.
 
TCamera = class
 public
   v1,v2,v3,v4:TVector;
   Position:TVector;
   Direction:TVector;
   constructor Create;
   destructor  Destroy; override;
   procedure   SetCamera;
 end;


Есть глобальная переменная,
ActiveCamera:PCamera;
Через которую идет обращение к текущей камере.
Текущая камера может быть только одна естественно.

Нужно чтобы в ActiveCamera хранился указатель на послюднюю камеру, для который был вызван метод SetCamera.


 
@!!ex ©   (2007-10-10 16:29) [19]

> Просто Self - это именно указатель. И именно на экземпляр
> класса. Никаких @ не требуется.

Хм.
Вот такое:
ActiveCamera:=Self;
Вызывает ошибку вида:
[Error] GamerUnit.pas(462): Incompatible types: "TCamera" and "PCamera"


 
Иванов   (2007-10-10 16:29) [20]

> @!!ex ©   (10.10.07 16:27) [18]

ActiveCamera: TCamera;

В SetCamera:
ActiveCamera := Self;


 
Ins ©   (2007-10-10 16:30) [21]


> ActiveCamera:PCamera;

А зачем делать указатель на указатель? Сделай так:

ActiveCamera: TCamera;


 
Иванов   (2007-10-10 16:30) [22]

> @!!ex ©   (10.10.07 16:29) [19]

И тип PCamera надо выбросить совсем. Не нужен.


 
@!!ex ©   (2007-10-10 16:33) [23]

Все. понял.
Спасибо за ликбез.


 
Иванов   (2007-10-10 16:39) [24]

> @!!ex ©   (10.10.07 16:33) [23]

Сам экземпляр объекта хранится в динамической памяти. Переменная ActiveCamera содержит адрес экземпляра - то есть, это уже указатель и есть. Локальная переменная Self тоже хранит адрес экземпляра, то есть это тоже уже и есть указатель.


 
Ins ©   (2007-10-10 16:40) [25]


> До сих пор и мне так казалось...

А что, сейчас уже не кажется? :)


 
Иванов   (2007-10-10 16:41) [26]

> Ins ©   (10.10.07 16:40) [25]

После [11] уже не кажется...


 
Ins ©   (2007-10-10 16:43) [27]


> После [11] уже не кажется...

Да ладно, не знал человек, теперь будет знать. Буквально вчера обсуждалось, что в instance-методах - self - это указатель на экземпляр, чей метод выполняется, в class-методах - указатель на RTTI класса, в static class методах - self-а вообще нет.


 
Иванов   (2007-10-10 16:48) [28]

> Ins ©   (10.10.07 16:43) [27]

Обсуждалось ??? (!!!)

А мне до сих пор и это казалось естественным и обсуждений не требующим.


 
homm ©   (2007-10-10 16:50) [29]

> [28] Иванов   (10.10.07 16:48)
> Обсуждалось ??? (!!!)

Дак вот же :)
http://delphimaster.net/view/15-1191913519/


 
Ins ©   (2007-10-10 16:54) [30]


> А мне до сих пор и это казалось естественным и обсуждений
> не требующим.

Ну почему же. Вот я за D7 сижу и про static class function не знал. Для кого-то было в новинку, что self в class-function - это указатель не на экземпляр, а на информацию о классе. Ну а кто-то не знал даже то, что self это вообще указатель :)


 
oxffff ©   (2007-10-10 17:01) [31]


> Ins ©   (10.10.07 16:43) [27]
>
> > После [11] уже не кажется...
>
> Да ладно, не знал человек, теперь будет знать. Буквально
> вчера обсуждалось, что в instance-методах - self - это указатель
> на экземпляр, чей метод выполняется, в class-методах - указатель
> на RTTI класса, в static class методах - self-а вообще нет.
>


Не RTTI, а указатель на VMT.


 
Ins ©   (2007-10-10 17:12) [32]


> Не RTTI, а указатель на VMT.

Уболтал.


 
Ins ©   (2007-10-10 17:17) [33]


> oxffff ©   (10.10.07 17:01) [31]

Почему-то считал, что они численно равны, проверил - ошибался.


 
Юрий Зотов ©   (2007-10-10 19:03) [34]

> Ins ©   (10.10.07 17:17) [33]

Равны с ЧЕМ?

Указатель на VMT - это понятно. Потому что VMT - это реальная структура данных, которая расположена в памяти и поэтому имеет адрес.

А RTTI адреса не имеет. Потому что RTTI - это не какая-то реальная структура данных, а понятие собирательное. Просто термин, обозначающий некую совокупность данных, регулярных процедур и методов классов, обеспечивающих получение информации о типе на этапе исполнения.

Например, многие методы класса TObject относятся к RTTI, структуры, процедуры и функции из модуля TypInfo - тоже часть RTTI, да и VMT - тоже часть RTTI. И даже операция IS самого языка - тоже часть RTTI.

Поэтому указателя на RTTI в природе не существует. А раз так, то непонятно, как же "они" могут быть равны. Кто это - "они"?


 
Инс ©   (2007-10-10 19:15) [35]


> [34] Юрий Зотов ©   (10.10.07 19:03)

Я подразумевал то, что возвращает функция TypeInfo. В справке так и написано:
Returns a pointer to compiler-generated runtime type information for a type identifier.


 
Ins ©   (2007-10-10 19:18) [36]


> [35] Инс ©   (10.10.07 19:15)

Елки-палки, на работе уже привык, что под ником Ins, а дома исправить забыл. Прошу прощения, последнее сообщение - мое, если вдруг это неочевидно.


 
Юрий Зотов ©   (2007-10-10 19:33) [37]

> Инс ©   (10.10.07 19:15) [35]

Сompiler-generated RTTI - это тоже только часть RTTI. Та часть, которая генерится компилятором и представляет собой реально расположенные в памяти данные. Естественно, они имеют адрес, но этот адрес с VMT, конечно же, не совпадает (да и какая может быть VMT для необъектных типов?).

Более того, TypeInfo даже и не функция, как таковая. Это, как и SizeOf, выражение, вычисляемое на стадии компиляции и подставляемое в программу в виде уже готового значения. Например, вот на этот код компилятор ругается:

procedure TForm1.FormCreate(Sender: TObject);
begin
 TypeInfo(string)
end;

а на этот - нет:

procedure TForm1.FormCreate(Sender: TObject);
var
 P: Pointer;
begin
 P := TypeInfo(string)
end;


 
oxffff ©   (2007-10-10 19:35) [38]


> Инс ©   (10.10.07 19:15) [35]
>
> > [34] Юрий Зотов ©   (10.10.07 19:03)
>
> Я подразумевал то, что возвращает функция TypeInfo. В справке
> так и написано:
> Returns a pointer to compiler-generated runtime type information
> for a type identifier


Typeinfo - это семантика копирования и финализации типа.


 
Ins ©   (2007-10-10 19:42) [39]


> Сompiler-generated RTTI - это тоже только часть RTTI.

Хорошо, пусть будет так. Значит говоря RTTI, я подразумевал ту RTTI, которая являются частью другой "большой" RTTI. Может быть есть еще какая-то "третья" RTTI, но лучше мне о ней не знать :) Кому надо - тот меня понял. В любом случае я был неточен, поправился (точнее меня поправили), и на этом можно и остановится.


> Более того, TypeInfo даже и не функция, как таковая.

Да, если можно так выразится, это "встроенная в компилятор функция", также как и Swap, New, SizeOf и некоторые другие. И что из этого?


 
Ins ©   (2007-10-10 19:44) [40]


> New

скорее правда это процедура... (это чтобы вы меня не поправляли) :)



Страницы: 1 2 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.02 c
3-1182775113
dest81
2007-06-25 16:38
2007.11.04
права доступа в ib


15-1190501517
Comunicator
2007-09-23 02:51
2007.11.04
BC3.1


9-1086063518
КиТаЯц
2004-06-01 08:18
2007.11.04
GLScene форум


15-1191487519
Beginner3
2007-10-04 12:45
2007.11.04
Комплексные числа


15-1191745953
digger
2007-10-07 12:32
2007.11.04
Проблема с мышами