【问题标题】:C++ shared_ptr based singletone what causes link error?基于 C++ shared_ptr 的单音导致链接错误的原因是什么?
【发布时间】:2012-11-17 14:12:26
【问题描述】:

所以我试试这个代码:

#ifndef TRANSMITTER_H
#define TRANSMITTER_H
class connector
{   
public:
    static boost::shared_ptr<connector> Instance(){
        if(!instance)
        {
            instance = boost::shared_ptr<connector>(new connector());
        }
        return instance;
    }
private:
    connector(){}
    static boost::shared_ptr<connector> instance;
};
#endif //TRANSMITTER_H

但是得到链接错误:

Error   3   error LNK2001: unresolved external symbol "private: static class boost::shared_ptr<class connector> connector::instance" (?instance@connector@@0V?$shared_ptr@Vconnector@@@boost@@A)

我想返回的 shared_ptr 有什么问题?我应该将其设为函数范围静态变量吗?

【问题讨论】:

标签: c++ design-patterns singleton shared-ptr


【解决方案1】:

这个

static boost::shared_ptr<connector> instance;

在你的类定义中只是一个声明。您似乎没有的是它的定义。这个定义在类定义之外。

但是,您可能更喜欢这样做:

class connector
{   
public:
    connector(connector const&) = delete;
    connector& operator=(connector const&) = delete;

    static boost::shared_ptr<connector> Instance()
    {
        static boost::shared_ptr<connector> instance (new connector);
        return instance;
    }
private:
    connector(){}
};

在这种情况下,instance定义Instance 的内联函数定义中的静态函数局部对象。它的好处是这种初始化在 C++11 中保证是线程安全的。

【讨论】:

  • 这是一个简洁的答案,尤其是线程安全的提示。令我不快的是,呈现的单例是可复制的,不是吗?是否可以同时拥有:不可复制的 shared_ptr-singleton?
  • @AquilaRapax:好点子!是的,我认为这应该很容易实现。我只是将复制 ctor 设为私有或将其转换为已删除的函数。
【解决方案2】:

你应该定义

boost::shared_ptr<connector> connector::instance;

在您的 *.cpp 中 这使得链接器在静态数据区为这个静态成员分配内存。

【讨论】:

    【解决方案3】:

    您必须在类声明之外定义静态成员。下面是定义的样子:

    boost::shared_ptr<connector> connector::instance;
    

    它应该在一个 cpp 中,对你来说可能是传输器.cpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2012-07-05
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多