Форум: "Начинающим";
Текущий архив: 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