Вы можете загрузить Container
приложения на свой Mac и просмотреть файлы, которые там есть.
В Xcode выберите устройство, выберите имя приложения в разделе «Установленные приложения», щелкните коробку настроек, затем выберите Скачать контейнер. В поиске, double finger tap the package
и select Show package contents
.
При движении во все усилие по созданию одноэлементного объекта использование обычного шаблона не обращается к второй части вопроса - способность сделать больше в случае необходимости. Одиночный элемент "шаблон" очень строг и не является чем-то большим чем глобальной переменной другим именем.
// myclass.h
class MyClass {
public:
MyClass();
void foo();
// ...
};
extern MyClass g_MyClassInstance;
// myclass.cpp
MyClass g_MyClassInstance;
MyClass::MyClass()
{
// ...
}
Теперь, в любом другом модуле просто включают myclass.h
и используйте g_MyClassInstance
как обычно. Если необходимо сделать больше, существует конструктор, готовый к Вам звонить.
Прежде всего то, что Вы хотите глобальные переменные, является 'запахом кода' (согласно Martin Fowler).
Но достигнуть влияния Вы хотите Вас, может использовать изменение Singleton.
Используйте статические функциональные переменные. Это означает, что переменная не создается, пока не используется (это дает Вам отложенные вычисления), и все переменные будут уничтожены в обратном порядке создания (таким образом, это гарантирует, что деструктор будет использоваться).
class MyVar
{
public:
static MyVar& getGlobal1()
{
static MyVar global1;
return global1;
}
static MyVar& getGlobal2()
{
static MyVar global2;
return global2;
}
// .. etc
}
Singleton является хорошим шаблоном для использования, но это имеет свои собственные недостатки. Действительно прочитайте следующие блоги Miško Hevery перед использованием одиночных элементов.
Поскольку небольшая модификация к шаблону "одиночка", если Вы действительно хотите также допускать возможность создания большего количества экземпляров с различным временем жизни, просто делает ctors, dtor, и оператор = общественность. Тем путем Вы получаете единственный глобальный экземпляр через GetInstance, но можно также объявить другие переменные на "куче" или стопке того же типа.
Основная идея является шаблоном "одиночка", как бы то ни было.
Я предпочитаю позволять одиночный элемент, но не осуществлять его так в, никогда не скрывают конструкторов и деструкторы. Это было уже сказано, просто оказав мою поддержку.
Мое скручивание - то, что я не использую, часто используют статическую функцию членства, если я не хочу создать истинный одиночный элемент и скрыть 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 я использую повышение для получения выровненной памяти вместо простого символьного массива, но не хотел, усложняют пример
Самым простым и параллелизмом безопасная реализация является одиночный элемент 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).