1

我正在使用 C++ 在 Linux 上设计一个线程安全的单例类boost::call_once

我收到以下编译器错误:

/tmp/ccLanvZI.o: In function `SingleTon::getInstance()':
singleTon.cpp:(.text._ZN9SingleTon11getInstanceEv[SingleTon::getInstance()]+0x1b): undefined reference to `SingleTon::p'
/tmp/ccLanvZI.o: In function `SingleTon::makeInstance()':
singleTon.cpp:(.text._ZN9SingleTon12makeInstanceEv[SingleTon::makeInstance()]+0x21): undefined reference to `SingleTon::SingleTon()'
singleTon.cpp:(.text._ZN9SingleTon12makeInstanceEv[SingleTon::makeInstance()]+0x2c): undefined reference to `SingleTon::p'
collect2: ld returned 1 exit status
make: *** [singlton] Error 1

看到一些帖子后,我仍然不知道如何处理这个错误。如何更改void (SingleTon::)()void (*)()


#include <iostream>
#include <pthread.h>
#include <boost/thread/mutex.hpp>
#include <boost/thread/once.hpp>
#include <boost/bind.hpp>
#include <boost/threadpool.hpp>
#include <boost/thread/thread.hpp>

boost::once_flag flag = BOOST_ONCE_INIT;

class SingleTon
{
    private:
        static SingleTon *p;
        SingleTon();
        SingleTon(const SingleTon&);
        SingleTon& operator=(const SingleTon&);
        void makeInstance();

    public:
        SingleTon* getInstance();

        ~SingleTon()
        {
            if (p)
                delete p;
        }  
};

void SingleTon::makeInstance() 
{
    p = new SingleTon;
    return;
}

SingleTon* SingleTon::getInstance()
{
    boost::call_once( makeInstance  , flag); // error !!!
    return p;
}


int main()
{
    SingleTon *s;
    s = SingleTon::getInstance();
    return 0;
}
4

3 回答 3

4

该错误表明 boost::call_once 不适用于成员函数指针。这是因为您忘记将 makeInstance 和 getInstance 都设为静态。

于 2012-05-27T21:54:06.753 回答
2

为什么要写析构函数?你打算摧毁哪个实例?哦等等,只有一个,因为它是一个单例,那么在这种情况下,为什么析构函数会尝试删除实例?无限递归失败。

无论如何,单身人士闻起来,避免他们。

于 2012-05-28T21:32:33.943 回答
1

正如 AardvarkSoup(美味营养丰富)所指出的,您需要makeInstance()并且getInstance()保持静止。

此外,您需要定义SingleTon(),而不仅仅是声明它,因为它用于makeInstance().

最后,您需要初始化静态成员p,例如:

SingleTon* SingleTon::p(nullptr);

这使得代码编译。然而,设计一个线程安全的单例类并非易事。请参阅此问题以获取大量链接,以获取有关为什么应尝试避免使用单例的非常完整的解释。

于 2012-05-27T23:30:03.840 回答