Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];

Вниз

Ограничение на создание количества экземпляров обьектов.   Найти похожие ветки 

 
bkv   (2003-06-02 18:01) [0]

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


 
Skier   (2003-06-02 18:05) [1]

Конечно. Их подсчёт.


 
Calm   (2003-06-02 18:12) [2]

В секции imlementation модуля, в котором объявлен класс объекта нужно сделать глобальную переменную.

В конструкторе класса инкрементировать ее, а в деструкторе - декрементировать.

Если в конструкторе обнаруживается, что значение счетчтика достигло определенного значения, то вызывать исключение. При этом автоматически вызовется десруктор объекта.


 
Мое имя   (2003-06-02 18:28) [3]

семафор?


 
bkv   (2003-06-03 10:20) [4]

Т.е нет никаких механизмов языка для решения этой задачи кроме подсчета?


 
vlv   (2003-06-03 10:25) [5]

В Паскале не предусмотрены переменные класса, только ОБЪЕКТЫ.

Так что лучше всего воспользоваться общими переменными, как советует Calm.


 
Skier   (2003-06-03 10:29) [6]


> В Паскале не предусмотрены переменные класса, только ОБЪЕКТЫ.

То есть ?


 
iZEN   (2003-06-03 11:22) [7]

Для Skier © (03.06.03 10:29).

Ну, в Java есть не только методы класса, но и поля:

public class Demo {
//Закрытый конструктор
private Demo() {
super();
}
//Глобальная переменная - счётчик экземпляров (видна из всех экземпляров данного класса)
private static int globalField = 0;
//Фабричный метод
public static Demo init() {
globalField++;
return new Demo();
}
//метод деинициализации (деструкторов в Java нет)
public void destroy() {
globalField--;
}
}

В ObjectPascal только так:

Demo = class
private
constructor Create();//Закрытый конструктор
public
destructor Destroy(); override;
class function Init(): Demo;//Фабричный метод
end;

implementation

var
GlobalField: Integer;//Глобальная переменная - счётчик экземпляров

//Закрытый конструктор
constructor Create();
begin
inherited Create();
end;

//Перегруженный деструктор
destructor Destroy(); override;
begin
Dec(GlobalField);
inherited Destroy();
end;

//Фабричный метод
class function Demo.Init(): Demo;
begin
Inc(GlobalField);
Result := Demo.Create();
end;



 
Skier   (2003-06-03 11:24) [8]

>iZEN © (03.06.03 11:22)

> Ну, в Java есть не только методы класса, но и поля:

И что ? У классовв Delphi не может быть полей что ли ?!


 
iZEN   (2003-06-03 11:27) [9]

Для Skier © (03.06.03 11:24).

Необходимо различать:
1) поля класса и поля объекта;
2) методы класса и методы объекта.
В Delphi осознано только п.2).



 
Skier   (2003-06-03 11:35) [10]

>iZEN © (03.06.03 11:27)
Ааа. Ты в этом смысле...


 
Sandman25   (2003-06-03 11:42) [11]

Skier © (03.06.03 11:24)

В Delphi будет такое поле будет в каждом обьекте.
В Java (и С++) можно сделать поле, которое будет shared между всеми экземплярами класса.


 
Skier   (2003-06-03 11:43) [12]

Господа, не наседайте ! Я уже понял что имелось в виду.


 
Sandman25   (2003-06-03 12:02) [13]

Skier © (03.06.03 11:43)

Извините. Я долго писал - Вашего сообщения Skier © (03.06.03 11:35) еще не видел.



 
VaS   (2003-06-03 13:20) [14]

Господа, человек под именем "Мое имя" давно назвал самый простой и потокобезопасный способ - семафор.


 
Reindeer Moss Eater   (2003-06-03 14:07) [15]

В секции imlementation модуля, в котором объявлен класс объекта нужно сделать глобальную переменную.
В конструкторе класса инкрементировать ее, а в деструкторе - декрементировать.
Если в конструкторе обнаруживается, что значение счетчтика достигло определенного значения, то вызывать исключение. При этом автоматически вызовется десруктор объекта.


Все это поможет ограничить количество объектов, создаваемых в ОДНОМ процессе.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
14-50461
_0$a_
2003-05-27 23:29
2003.06.16
WinApp рулит


14-50488
Gremlin
2003-05-30 11:40
2003.06.16
Про FTP


14-50454
snake1977
2003-05-29 17:26
2003.06.16
Захват таблицы


14-50493
N169
2003-05-30 11:26
2003.06.16
Солнечное затмение


7-50535
tararasyk
2003-04-12 12:01
2003.06.16
Как узнать зарегистрированный ли в системе ActiveX Automation Obj





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский