Связывание статического синглтон-класса - PullRequest
3 голосов
/ 02 марта 2012

когда я пытаюсь связать класс SIngleton и получить

sources/singleton.cpp:8:41: error: no se puede declarar que la función miembro ‘static myspace::Singleton& myspace::Singleton::Instance()’ tenga enlace estático [-fpermissive]
sources/director.cpp:19:35: error: no se puede declarar que la función miembro ‘static void myspace::Singleton::Destroy()’ tenga enlace estático [-fpermissive]
myspace: *** [objects/singleton.o] Error 1

класс Singleton:

#Singleton.h
#include <stdlib.h>

namespace myspace {

    class Singleton
    {
    public:
        static Singleton& Instance();
        virtual ~Singleton(){};
    private:
        static Singleton* instance;
        static void Destroy();
        Singleton(){};
        Singleton(const Singleton& d){}
    };
}

#Singleton.cpp
#include "../includes/Singleton.h"

namespace myspace {
    Singleton* Singleton::instance = 0;

    static Singleton& Singleton::Instance()
    {
        if(0 == instance) {
            instance = new Singleton();

            atexit(&Destroy);
        }

        return *instance;
    }

    static void Singleton::Destroy()
    {
        if (instance != 0) delete instance;
    }
}

мне нужны некоторые LDFLAGS для компоновщика?

Ответы [ 2 ]

7 голосов
/ 02 марта 2012

Вы можете объявлять только статические методы в объявлениях, это не разрешено в реализациях.Просто измените свои реализации на

Singleton& Singleton::Instance()
{

и

void Singleton::Destroy()
{

, и все будет в порядке.

4 голосов
/ 02 марта 2012

Вам необходимо удалить static из определений в файле cpp: компилятор уже знает, Singleton::Instance и Singleton::Destroy являются static из их объявлений .Все остальное выглядит правильно.

...