Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > const в методе


Автор: altarasjuk 16.8.2003, 22:08
Всем привет!

Я уже неоднократно сталкивался с кодом вроде этого:
Код
class function GetInstance;
const
 instance: TSomeClass = nil;
begin
 if instance = nil then
   instance:= TSomeClass.Create(); //В этом месте - ругается....
 Result:= instance;
end;
Вообще-то понятно почему он ругается..., но это ж не я придумал такой код. Как я понимаю для его работы нужна какая-то директива компиляции. Если не секрет, то какая. Я использую
D7. Если этот код полная чушь, на что у меня есть подозрения, то посоветуйте наиболее Объектно-ориентированный подход к шаблону Singleton. Я использую переменную, объявленную после implementation.

Автор: Immortal 16.8.2003, 22:58
Ну как ты можешь создавать TSomeClass в константе, да и код
Код

if instance = nil then

абсолютно не актуален зачем проверать на нулевое значение, если константа instance будет всегда nil, на то она и константа smile.gif

Автор: p0s0l 17.8.2003, 17:15
Насчет констант: если у константы объявлен тип, то она является обычной переменной, только в неё писать ничего нельзя обычным :=

Вот пример:
Код
procedure TForm1.Button1Click(Sender: TObject);
const
 x : integer = 1;
var
 x1, x2 : integer;
begin
 x1 := x;
 PInteger(@x)^ := x+1; // в правой части компилятор подставит адрес константы x, а не её значение !
 x2 := x;
 Caption := IntToStr(x1) + ' ' + IntToStr(x2);
end;

Даже если x является локальной, все равно получитя так:
при первом клике выдаст 1 и 2
при втором 2 и 3
при третьем 3 и 4
и т.д.
Т.е. начальное значение не восстанавливается, что, по-моему, тебе и надо.

Так что, твой код почти нормальный, только странно, что в константу пишется обычным присвоением...
Может и правда, где-то можно разрешить изменение констант какой-нибудь директивой ?

Автор: p0s0l 17.8.2003, 17:32
А и правда, есть директива {$J+} или Project->Options->Compiler->Assignable Typed Constants !
Так что в примере выше можно было писать x := x + 1 или Inc(x) !

Автор: altarasjuk 18.8.2003, 08:52
Immortal, я ж говорю - это не мой код, если я вспомню ссылку на тот код - дам её. А вот собственно она - http://www.delphikingdom.com/article/singleton.htm a это цитата с этой странички...
Цитата
class function TProgressor.AccessInstance(Request: Integer): TProgressor;
const
  FInstance: TProgressor = nil;
begin
  case Request of
    0: ;
    1: if not Assigned(FInstance) then FInstance := CreateInstance;
    2: FInstance := nil;
  else
    raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
  end;
  Result := FInstance;
end

p0s0l, спасибо smile.gif . А то знаешь, не люблю код писаный через одно место.... А шаблон Singleton в делфях реализовать по другому сложно (ну нет тут статических полей, Bolrand ещё о таком чуде не знает sad.gif )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)