Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
@!!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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.064 c
3-1182872569
Ilg
2007-06-26 19:42
2007.11.04
Русские буквы в текстовой БД


4-1178095614
NeyroSpace
2007-05-02 12:46
2007.11.04
Как узнать что ползунок ScrollBar дошел до конца прокрутки?


11-1175331301
Vladimir Kladov
2007-03-31 12:55
2007.11.04
Версия 2.56


2-1192008880
Winni
2007-10-10 13:34
2007.11.04
протокол POP3, прием html-сообщений


15-1191319495
Azize
2007-10-02 14:04
2007.11.04
Посветуйте литературу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский