Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> const в методе, теория.... 
:(
    Опции темы
altarasjuk
  Дата 16.8.2003, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Всем привет!

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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Immortal
Дата 16.8.2003, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 15.8.2003

Репутация: нет
Всего: нет



Ну как ты можешь создавать TSomeClass в константе, да и код
Код

if instance = nil then

абсолютно не актуален зачем проверать на нулевое значение, если константа instance будет всегда nil, на то она и константа smile.gif
PM MAIL ICQ   Вверх
p0s0l
Дата 17.8.2003, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



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

Вот пример:
Код
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
и т.д.
Т.е. начальное значение не восстанавливается, что, по-моему, тебе и надо.

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



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 17.8.2003, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
altarasjuk
Дата 18.8.2003, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Immortal, я ж говорю - это не мой код, если я вспомню ссылку на тот код - дам её. А вот собственно она - Singleton 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 )


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0781 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.