Статическая переменная внутри конструктора, есть ли какие-либо недостатки или побочные эффекты?

StackOverflow https://stackoverflow.com/questions/2936910

Вопрос

Что я хочу сделать: запустить определенный необходимый код всякий раз, когда в рамках программы будет использоваться экземпляра класса. Этот код проверит по требованиям и т. Д. И должен быть запущен только один раз.

Я обнаружил, что это может быть достигнуто с использованием другого объекта в качестве статической переменной внутри конструктора. Вот пример для лучшей картины:

class Prerequisites
{
     public:
         Prerequisites() {
              std::cout << "checking requirements of C, ";
              std::cout << "registering C in dictionary, etc." << std::endl;
         }
};


class C
{
    public:
         C() {
             static Prerequisites prerequisites;
             std::cout << "normal initialization of C object" << std::endl;
         }
};

Что меня беспокоит, в том, что я не видел подобное использование статических переменных до сих пор. Есть ли недостатки или побочные эффекты или я что-то упускаю? Или, может быть, есть лучшее решение? Любые предложения приветствуются.

Это было полезно?

Решение

Это не безрезультатно, поскольку если два потока пытаются в первую очередь строить C, предварительные условия, вероятно, будут инициализироваться дважды.

Если вы в порядке с этим, вы, вероятно, можете сделать это, хотя игры Scoped Constructor System обладает нулевой обнаружением (то есть, когда вы забудете «трюк» или другие, пытаетесь прочитать ваш код, они будут сбитыми на то, что происходит ).

Другие советы

Есть ли недостатки или побочные эффекты или я что-то упускаю? Или, может быть, есть лучшее решение? Любые предложения приветствуются.

Может быть понятнее (хотя и более многословную), чтобы явно вызвало статический метод.

class Prerequisites
{
    static bool checkedOnce;    
public:
    static void checkOnce() {
        if (checkedOnce)
        {
            //already checked: don't check again
            return;
        }
        //else check them now
        checkedOnce = true;
        std::cout << "checking requirements of C, ";
        std::cout << "registering C in dictionary, etc." << std::endl;
    }
};

bool Prerequisites::checkedOnce = false;

class C
{
public:
    C() {
        Prerequisites::checkOnce();
        std::cout << "normal initialization of C object" << std::endl;
    }
};

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top