Глобальный экземпляр класса в C++

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

В Xcode выберите устройство, выберите имя приложения в разделе «Установленные приложения», щелкните коробку настроек, затем выберите Скачать контейнер. В поиске, double finger tap the package и select Show package contents.

см. Пример: go to Window -> Devices

9
задан Adam Rosenfield 18 November 2008 в 04:47
поделиться

7 ответов

При движении во все усилие по созданию одноэлементного объекта использование обычного шаблона не обращается к второй части вопроса - способность сделать больше в случае необходимости. Одиночный элемент "шаблон" очень строг и не является чем-то большим чем глобальной переменной другим именем.

// myclass.h

class MyClass {
public:
    MyClass();
    void foo();
    // ...
};

extern MyClass g_MyClassInstance;

// myclass.cpp

MyClass g_MyClassInstance;

MyClass::MyClass()
{
    // ...
}

Теперь, в любом другом модуле просто включают myclass.h и используйте g_MyClassInstance как обычно. Если необходимо сделать больше, существует конструктор, готовый к Вам звонить.

18
ответ дан 4 December 2019 в 09:39
поделиться

Прежде всего то, что Вы хотите глобальные переменные, является 'запахом кода' (согласно Martin Fowler).

Но достигнуть влияния Вы хотите Вас, может использовать изменение Singleton.
Используйте статические функциональные переменные. Это означает, что переменная не создается, пока не используется (это дает Вам отложенные вычисления), и все переменные будут уничтожены в обратном порядке создания (таким образом, это гарантирует, что деструктор будет использоваться).

class MyVar
{
    public:
        static MyVar& getGlobal1()
        {
            static MyVar  global1;
            return global1;
        }
        static MyVar& getGlobal2()
        {
            static MyVar  global2;
            return global2;
        }
        // .. etc
}
3
ответ дан 4 December 2019 в 09:39
поделиться

Шаблон "одиночка" - то, что Вы ищете.

0
ответ дан 4 December 2019 в 09:39
поделиться

Singleton является хорошим шаблоном для использования, но это имеет свои собственные недостатки. Действительно прочитайте следующие блоги Miško Hevery перед использованием одиночных элементов.

  1. Одиночные элементы являются Патологическими Лгунами

  2. Первопричина одиночных элементов

  3. Куда все одиночные элементы пошли?

0
ответ дан 4 December 2019 в 09:39
поделиться

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

Основная идея является шаблоном "одиночка", как бы то ни было.

1
ответ дан 4 December 2019 в 09:39
поделиться

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

Мое скручивание - то, что я не использую, часто используют статическую функцию членства, если я не хочу создать истинный одиночный элемент и скрыть constr. Мой обычный подход - это:

template< typename T >
T& singleton( void )
{
   static char buffer[sizeof(T)];
   static T* single = new(buffer)T;
   return *single;
}

Foo& instance = singleton<Foo>();

Почему бы не использовать статический экземпляр T вместо нового размещения? Статический экземпляр дает гарантии порядка конструкции, но не порядок разрушения. Большинство объектов уничтожается в обратном порядке конструкции, но статических и глобальных переменных. При использовании статической версии экземпляра, Вы в конечном счете получите таинственный/неустойчивый segfaults и т.д. после конца основного.

Это означает, одноэлементный деструктор никогда не будут называть. Однако процесс в снижении так или иначе и ресурсах будет исправлен. Это - вид жесткого для привыкания к, но доверять мне в данный момент нет лучшего кросс-платформенного решения. К счастью C++ 0x имеет внесенные изменения для гарантии порядка разрушения, который решит эту проблему. После того как Ваш компилятор поддерживает новый стандарт, просто обновляют одноэлементную функцию для использования статического экземпляра.

Кроме того, я в фактическом implemenation я использую повышение для получения выровненной памяти вместо простого символьного массива, но не хотел, усложняют пример

0
ответ дан 4 December 2019 в 09:39
поделиться

Самым простым и параллелизмом безопасная реализация является одиночный элемент Scott Meyer:


#include <iostream>

class MySingleton {
public:
    static MySingleton& Instance() {
        static MySingleton singleton;
        return singleton;
    }
    void HelloWorld() { std::cout << "Hello World!\n"; }
};

int main() {
    MySingleton::Instance().HelloWorld();
}

Посмотрите тему IV здесь для анализа от John Vlissides (от известности GoF).

0
ответ дан 4 December 2019 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: