Невозможно получить доступ к приватному члену в деструкторе синглтон-класса - PullRequest
4 голосов
/ 25 января 2010

Я пытаюсь реализовать этот синглтон-класс. Но я столкнулся с этой ошибкой:

'Singleton :: ~ Singleton': не может получить доступ к закрытому члену, объявленному в классе 'Singleton' Это помечено в заголовочном файле, последняя строка которого содержит закрывающую скобку.

Может кто-нибудь помочь мне объяснить причину этой проблемы? Ниже мой исходный код.

Singleton.h:


class Singleton
{
public:
    static Singleton* Instance()
    {
        if( !pInstance )
        {
            if( destroyed )
            {
                // throw exception
            }
            else
            {
                Create();
            }

        }
        return pInstance;
    }
private:
    static void Create()
    {
        static Singleton myInstance;
        pInstance = &myInstance;
    }
    Singleton() {}
    Singleton( const Singleton& );
    Singleton& operator=( const Singleton& );
    ~Singleton() 
    {
        pInstance = 0;
        detroyed = false;
    }

    static Singleton* pInstance;
    static bool destroyed;
};

Singleton.cpp:


Singleton* Singleton::pInstance = 0;
bool Singleton::destroyed = false;

Внутри моей основной функции:


Singleton* s = Singleton::Instance();

Если я сделаю деструктор открытым, то проблема исчезнет. Но в книге (Modern C ++ Design) говорится, что она должна быть закрытой, чтобы пользователи не могли удалить экземпляр. Мне действительно нужно поместить некоторый код для очистки для pInstance и уничтожить внутри деструктора.

Кстати, я использую Visual C ++ 6.0 для компиляции.

Ответы [ 5 ]

2 голосов
/ 25 января 2010

Я не эксперт по C ++ или VC, но ваш пример похож на пример, описанный на на этой странице ..., который автор называет ошибкой компилятора.

2 голосов
/ 25 января 2010

Возможно, вам следовало сообщить нам, что версия Visual C ++, с которой вы работаете, - VC6. Я могу повторить ошибку с этим.

На данный момент у меня нет другого предложения, кроме как перейти на более новую версию MSVC, если это возможно (VC 2008 доступен бесплатно в Express Edition).

Просто пара других точек данных - VC2003 и более поздние не имеют проблем с частным деструктором Singleton, как в вашем примере.

2 голосов
/ 25 января 2010

Код, который вы разместили, не имеет проблем, поэтому проблема должна быть в какой-то другой части вашего исходного кода.

Сообщение об ошибке будет сопровождаться именем файла и номером строки, в которой возникает проблема. Пожалуйста, посмотрите на строку, и вы увидите немного кода, который либо пытается вызвать delete для одноэлементного указателя, либо пытается создать экземпляр singleton.

Сообщение об ошибке будет выглядеть примерно так (файл и номер строки - только пример):

c:\path\to\file.cpp(41) : error C2248: 'Singleton::~Singleton': cannot access private member declared in class 'Singleton'

Так что в этом случае вы бы хотели увидеть, что происходит в строке 41 в файле file.cpp.

0 голосов
/ 25 января 2010
class Singleton
{
     static Singleton *pInstance = NULL;  
     Singleton(){};

     public:

    static Singleton * GetInstance() {

          if(!pInstance)
          {
               pInstance = new Singleton();
          }
          return pInstance;
     }

     static void  RemoveInstance() {

          if(pInstance)
          {
               delete pInstance;
               pInstance = NULL;
          }

     }
};
0 голосов
/ 25 января 2010

Лично я не помещал деструкторы в мои синглтоны, если я не использую шаблонный синглтон-класс, но затем я делаю их защищенными.

template<class T>
class Singleton
{
public:
    static T &GetInstance( void )
    {
        static T obj;
        return obj;
    }

    static T *GetInstancePtr( void )
    {
        return &(GetInstance());
    }

protected:
    virtual ~Singleton(){};
    Singleton(){};

};

тогда напишите мой класс как

class LogWriter : public Singleton<LogWriter>
{
friend class Singleton<LogWriter>;
}
...