2

所以我试试这段代码:

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

4

3 回答 3

14

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

于 2012-11-17T15:29:03.860 回答
2

你应该定义

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

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

于 2012-11-17T14:39:31.913 回答
1

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

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

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

于 2012-11-17T14:40:10.737 回答