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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вернуть указатель на синглетон? 
V
    Опции темы
Mephisto
Дата 22.11.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



Есть что-то вроде:
Код
function GetRoot : TDevRoot;
begin
  result := vgRoot;
  if vgRoot = nil Then
  begin
    vgRoot := TDevRoot.Create(nil);
    result := vgRoot;
  end;
end;


где TDevRoot некий сиглетон. Т.е. обьект экземпляр которого существует в единственном экземпляре. Как сделать так чтоб функция возвращала указатель на него?
Типа ^TDevRoot?
PM   Вверх
Guedda
Дата 22.11.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Код

type
  PDevRoot = ^TDevRoot;


Да и вообще вопрос не сильно понятен...


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Romkin
Дата 22.11.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



TDevRoot - это уже указатель! Судя по вызову, это class. Любая переменная класса - указатель
PM ICQ   Вверх
Mephisto
Дата 22.11.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



Цитата(Romkin @  22.11.2006,  11:27 Найти цитируемый пост)
TDevRoot - это уже указатель! Судя по вызову, это class. Любая переменная класса - указатель 

Спасибо. Верно. В конкретном случае была моя ошибка. 

Кстати, по теме:

Можно ли освободить обьект и сбросить указатель в таком случае:

UnitSingle
Код

...
function GetRoot : TDevRoot;
implementation

var vgRoot : TdevRoot; //Собственно синглетон.

function GetRoot : TDevRoot;
begin
  result := vgRoot;
  if vgRoot = nil Then
  begin
    vgRoot := TDevRoot.Create(nil);
    result := vgRoot;
  end;
end;
...


UnitMain
Код

procedure DestroyRoot;
begin
  //как можно сбросить vgRoot?
end;

PM   Вверх
Elfebet
Дата 22.11.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



може так?
Код

vgRoot.Free;
vgRoot:=nil;



--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Romikgy
Дата 22.11.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



я так понял что ты используешь его как флаг,
тогда зачем каждый раз его создавать и уничтожать? имхо проще присваивать какое то значемие и если оно есть то сингл установлен , если нет то сброшен?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mephisto
Дата 22.11.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



Цитата(Romikgy @  22.11.2006,  13:41 Найти цитируемый пост)
я так понял что ты используешь его как флаг

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

Естественно в конце нужно выгрузить.
PM   Вверх
Romikgy
Дата 22.11.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



значит я тя не сильно понял


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mephisto
Дата 22.11.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



На самом деле выгрузка делается в части finalization модуля. Вопрос в том. Можно ли с другой части сбросить сцылку?
PM   Вверх
Rennigth
Дата 22.11.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



Цитата(Mephisto @  22.11.2006,  11:24 Найти цитируемый пост)
Можно ли освободить обьект и сбросить указатель в таком случае:

UnitSingle

код Pascal/Delphi
...
function GetRoot : TDevRoot;
implementation

var vgRoot : TdevRoot; //Собственно синглетон.

function GetRoot : TDevRoot;
begin
  result := vgRoot;
  if vgRoot = nil Then
  begin
    vgRoot := TDevRoot.Create(nil);
    result := vgRoot;
  end;
end;
...



А почему нет? смотря где ты его используешь. или в секции finalization или при destroy объекта в контексте которого используешь:

Код

  if Assigned(vgRoot) then
    FreeAndNil(vgRoot);



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Mephisto
Дата 22.11.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



кхе-кхе

Переменная vgRoot видна только в пределах модуля UnitSingle!

Выгружать хочу с любого места кода. Для этого и доступ через GetRoot.
PM   Вверх
Bose
Дата 22.11.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



забавная ситуация получится в случае:

Код

GetRoot.Free;


 smile 
PM MAIL WWW Skype   Вверх
Mephisto
Дата 23.11.2006, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

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



Цитата(Bose @  22.11.2006,  19:47 Найти цитируемый пост)
забавная ситуация получится в случае:

На самом деле обьект выгрузит. Но указатель оставит прежним. Желательно конечно б сделать
Код

  FreeAndNil(GetRoot);

Но нельзя...
PM   Вверх
Romikgy
Дата 23.11.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

UnitSingle

код Pascal/Delphi
...
function GetRoot : TDevRoot;
procedure ClearRoot;
implementation

var vgRoot : TdevRoot; //Собственно синглетон.

function GetRoot : TDevRoot;
begin
  result := vgRoot;
  if vgRoot = nil Then
  begin
    vgRoot := TDevRoot.Create(nil);
    result := vgRoot;
  end;
end;
procedure ClearRoot;
begin
 vgRoot.Free;
 vgRoot:=nil;
end;

не ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romkin
Дата 23.11.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я вообще не вижу смысла в идее освобождения откуда угодно: либо нужен не синглетон, либо не нужно освобождать smile
Какой смысл? Взяли объект много раз, в одном месте освободили - в других получим гадость, недействительный указатель. Это опасно, потом ловить ошибки долго придется.
Может, нужен счетчик использования? Тогда - простой интерфейс. 
Нужно создавать и убирать обычным образомм? Тогда - настоящий синглетон.
Но так, чтобы много раз взял объект, а освободил один раз где попало - не, не надо smile
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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