2016-04-24 90 views
3

在一类静态初始化我有一个代表类的一个实例,一个静态成员:与私有构造

class A { 
public: 
    static const std::shared_ptr<A> INSTANCE; 
private: 
    A(); 
}; 

为了防止更多的情况下,我做了构造私有。现在我无法初始化静态变量,因为初始化程序无法访问私有成员。下面是我在.cpp文件中使用的代码:

const std::shared_ptr<A> A::INSTANCE = std::make_shared<A>(); 

工厂方法将没有帮助,因为它必须是公开为好。我还能做些什么来完成这项工作?注意:如果可能,我想避免使用典型的static get()方法。

回答

5

不能使用make_shared,但你可以直接创建实例:

const std::shared_ptr<A> A::INSTANCE { new A }; 
+0

我感到困惑。为什么make_shared()不能使用这种方法(或者为什么在这个变体没有可见性时会遇到麻烦)?无论如何,它的工作,所以谢谢:-) –

+1

'make_shared'定义在你的类之外,所以它不能访问私有构造函数。但是静态成员的初始化器被认为是类定义的一部分,所以它能够访问私有成员。 –

0

静态成员的初始化与构造函数无关,所以全局语句确实是正确的方法。它不适合你吗?

编辑:我刚刚意识到你正试图避免使用单例访问方法出于某种原因。听起来很像Borg pattern。 :)与你无关具体的问题,但我建议你重新考虑。