基于C ++ shared_ptr的单一单一导致链接错误的原因是什么?

时间:2012-11-17 14:12:26

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

所以我试试这段代码:

#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有什么问题?我应该把它作为函数范围的静态变量吗?

3 个答案:

答案 0 :(得分:13)

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中是线程安全的。

答案 1 :(得分:2)

你应该定义

boost::shared_ptr<connector> connector::instance;
你的* .cpp中的

这使得链接器为静态数据区域中的静态成员分配内存。

答案 2 :(得分:1)

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

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

它应该在cpp中,因为你可能是transmit.cpp