2017-09-04 28 views
3

我的代码:如何访问派生构造函数迈尔斯单例模式

‘Derived::Derived()’ is protected 
    Derived() { } 
    ^

我该如何解决这个问题:

template<class T> 
class Singleton { 
public: 
    static T& instance() { 
     static T obj; 
     return obj; 
    } 

protected: 
    Singleton() { } 
    Singleton(Singleton const& other); 
    void operator=(Singleton const& other); 
}; 

class Derived : public Singleton<Derived> { 
protected: 
    Derived() { } 
}; 

void test() { 
    Derived::instance(); 
} 

我在static T obj行收到此错误?也许使用friend关键字?但那会有点尴尬。

注意:我意识到Meyers单身人士的名字和想法的原因,但是我自己实现它,是因为我无法找到我第一次阅读它的地方。我认为这是在“有效的C++”或“更有效的C++”,但我无法在那里找到它。我在网上找到的例子并没有使用CRTP泛化。

+0

的Singleton模式已经被遗弃了自己的创造者以后。你应该避免使用它。迈耶斯不是作者之一。 – Ron

+0

这确实不是最好的主意。只需从CppCon2016(https://www.youtube.com/watch?v=23xDn3ReH7E)这5分钟的视频,这是有趣和有益的! (命名空间是singleton [extensible]) – Oliv

回答

1

Singletoninstance函数成员的Derived的朋友:

struct Derived{ 
    //... 
    friend Derived& Singleton<Derived>::instance(); 
    }; 
+0

甚至更​​简单:'public Singleton { friend class Singleton ; ....' –

相关问题