Большой Воронежский Форум
» Программирование>Как запретить создание более чем одного экземпляра класса?
Krasa 10:13 27.03.2008
Помогите блондинке!!!
Подскажите пожалуйста как в дельфях запретить создание более чем одного экземпляра некого класса?
Меня устроит любой метод, как в основной программе, так и при описании класса, экземпляр которого создается... [Ответ]
SmallBo 15:34 27.03.2008
kolega: Singelton - это паттерн, т.е. шаблон программирования. А девушка спрашивает именно о реализации. В дельфях не очень разбираюсь, но почему бы не сделать так, как делается в С++? Т.е. объявить конструктор класса закрытым? [Ответ]
SmallBo 15:58 27.03.2008
kolega: да пожалуйста, сколько угодно Просто можно было дать побольше конкретики, а не говорить общие фразы. Сколько она будет искать реализацию этого шаблона на дельфи? И найдет ли вообще? [Ответ]
Nvetal 18:53 27.03.2008
Ну вот как-то так

Сообщение от :
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;
type
TMyClass=class
public
constructor Create;
procedure Test;
protected
class var i:word;
class property Count:word read i write i default 0;
end;
{ TMyClass }

constructor TMyClass.Create;
begin
if Count>=1 then
begin
writeln('Oblom');
raise EAbort;
end
else inc(Count);
end;

var
a,b:TMyClass;
procedure TMyClass.Test;
begin
Writeln('test');
end;

begin
a:=TMyClass.Create;
a.Test;
b:=TmyClass.Create;
readln;
end.

Только там где вызывается крейт надо отлавливать EAbort. Можно конечно и как-нить подругому придумать чтоб конструктор не возвращал ссылку на объект. Но первое что пришло в голову. [Ответ]
Krasa 19:40 27.03.2008
Nvetal спасибо за помощь, смысл понятен, пойду попробую к своей проге пристроить.
Если еще кто то придумает другие методы буду рада ;-) [Ответ]
Ivan XXX 20:03 27.03.2008
создается глобальная переменная
bool flag = true;

в коде при создании экземпляра класса проверяем
if ( flag == true )
{
создаем экземпляр
flag = false;
}

гы ) [Ответ]
DeniSS1 20:10 27.03.2008
Ivan XXX, :-) Просто и без выпендрёжа! [Ответ]
Pengvin 20:23 27.03.2008
еще можно через mutexы что-нибудь намутить, тогда можно запретить создание еще одного экземпляра класса по всей ОС.
var
Mutex: THandle;
...
Mutex := CreateMutex(nil, true, 'singel_mega_class');
LastErr := GetLastError;
if LastErr = ERROR_ALREADY_EXISTS then
begin
//тут обламываем
end
else
//тут не обламываем [Ответ]
manifest 10:45 28.03.2008
На С++ это выглядело бы так... В делфи алгоритм такой же.

Сообщение от :
class A
{
public:
//// 1) В статической функции-члене создаём экземпляр класса
//// при условии что счётчик равен нулю
static A *create() {if(counter == 0) return new A;}
//// 2) В деструкторе декрементируем счётчик
~A() {--counter;}

private:
//// 3) В конструкторе инкрементируем счётчик, конструктор должен быть закрытым
A() {++counter;}
//// 4) Для подсчёта экземпляров класса используем - его статическую переменную
static size_t counter;
};
//// Инициализируем счётчик нулём
size_t A::counter = 0;

int main()
{
//// Создание объекта будет выглядеть так, последующие попытки будут заканчиваться неудачей
A *a = A::create();
//// После освобождения памяти, занимаемой объектом, он может быть создан снова
delete a;
}

[Ответ]
Krasa 19:19 30.03.2008
Всем спасибки!!! Все идеи интересные, жаль в дельфях конструкторы не бывают закрытыми...
IvanXXX ты просто гениален [Ответ]
Вверх