Перейти к содержанию
    

ошибка при компиляции С++

2 часа назад, Axel сказал:

конечно же объекты удаляются.

Обычно такого в синглтонах не предусматривается. Как это реализовано? Статическая функция класса для удаления?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, AHTOXA said:

Обычно такого в синглтонах не предусматривается. Как это реализовано? Статическая функция класса для удаления?

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

Например так (при использовании placement new):

static CFooA * Instance()
{
	CFooA *ret_val = 0;
	
	if(CClassFooId::FooInstance)
	{
		if(sem_polling(&CClassFooId::UseCounter) != SEM_NOT_IN_USE)
		{
			if(CClassFooId::FooInstance->GetClassId() != FOO_A_CLASS_ID)
			{
				CClassFooId::FooInstance = 0;
			}
		}
		else
		{
			ret_val = INST_CREATE_ERR;
		}
	}
	
	if(!ret_val)
	{
		if(!CClassFooId::FooInstance)
		{
			mutex_lock(&InstMutex, WAIT_INFINITE);
			if(!CClassFooId::FooInstance)
			{
				CClassFooId::FooInstance = (CClassFooId *)new ((void *)FooMemPool) CFooA();
			}
			mutex_unlock(&InstMutex);
		}
		ret_val = (CFooA *)CClassFooId::FooInstance;
	}
	else
	{
		ret_val = 0;
	}
	return ret_val;
}
		
static CClassFooId *ClearInatance() 
{ 
	if(sem_polling(&CClassFooId::UseCounter) == SEM_NOT_IN_USE)
	{
		CClassFooId::FooInstance = 0; 
	}
	return CClassFooId::FooInstance;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял, то при использовании вашего синглтона недостаточно просто вызвать CFooA::Instance(), а нужно предварительно захватывать семафор CClassFooId::UseCounter? Тогда это так себе вариант. Ведь суть синглтона в том, что программист не может сделать неправильно. А в вашем случае - запросто:

	auto a = CFooA::Instance();

	auto b = CFooB::Instance(); // здесь a испортили

	а->foo(); // кирдык!

В общем, идея понятная, но от собственно синглтона здесь мало что есть. Вернее, это уже не синглтон, а какая-то другая конструкция :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...