Код: Выделить всё
void Function()
{
class CCaller
{
public:
CCaller()
{
<CodeA>
}
};
static CCaller singleCall;
<CodeB>
}
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Код: Выделить всё
void Function()
{
class CCaller
{
public:
CCaller()
{
<CodeA>
}
};
static CCaller singleCall;
<CodeB>
}
Это интуитивное предубеждение, которое не поддается строгому доказательству. Тем более что у объекта который он конструирует нет никакого состояния, и поэтому он не может сломаться.Din666 писал(а):считаю выполнение большого кода в конструкторе злом
Красивого решения тут нет. Хорошая функция должна вести себя одинаково для одних и тех же аргументов. С другой стороны, переносить инициализацию статических данных на клиента тоже некомильфо. Он не будет разбираться в тонкостях.Din666 писал(а):в данном случае больше похоже на костыль, чем на красивое решение
Ни первое, ни второе для нашего класса не актуально. Конструктор максимально прост, он не бросает никаких исключений, и класс никто больше не использует в качестве агрегата. Так что никак костылейDin666 писал(а): 1.например: использование класса с тяжелым конструктором в другом, критичном по скорости/памяти, участке кода.
2.например: ловить исключения вызванные из конструктора не всегда, но иногда, требуют плясок с бубном.
Код: Выделить всё
void Function()
{
_TCHAR* szAtomName = _T("SingleCallCode");
if (!::FindAtom(szAtomName))
{
::AddAtom(szAtomName);
<Code A>
}
<Code B>
}
Это не атомарная операция. Два и более тредов могут одновременно не найти атом. Тут надо std::atomic_flag использовать.WinMain писал(а):Вот как эту задачку можно решить средствами Windows API без использования статических объектов С++Код: Выделить всё
if (!::FindAtom(szAtomName)) { ::AddAtom(szAtomName); }
Код: Выделить всё
namespace {
std::atomic_flag guard = ATOMIC_FLAG_INIT;
}
void Function()
{
if (!guard.test_and_set(std::memory_order_acquire))
{
doOnce();
}
doAlways();
}