Почему Visual C++ 6 жалуется на частном деструкторе

Следующий код хорошо работает для Visual C++ 2008. Однако, когда прибывает в Visual C++ 6, я получаю следующую ошибку. Позвольте мне знать, почему, и то, как я могу зафиксировать ошибку, но все еще делать деструктор, остается конфиденциально.

class X
{
public:
    static X& instance()
    {
        static X database;
        return database;
    }

private:

    X() {}                    // Private constructor
    ~X() {}                   // Private destructor
    X(const X&);              // Prevent copy-construction
    X& operator=(const X&);   // Prevent assignment
};

int main()
{
    X::instance();
}

C:\Projects\ttt6\main.cpp(178): ошибка C2248: 'X:: ~X': не может получить доступ к члену парламента, не занимающему официального поста, объявленному в классе 'X' C:\Projects\ttt6\main.cpp(175): посмотрите объявление 'X:: ~X'

5
задан Cheok Yan Cheng 26 February 2010 в 06:42
поделиться

4 ответа

Пересмотренный пример показывает подтвержденную ошибку компилятора для VC6 - обычным обходным решением было просто сделать деструктор публичным.

7
ответ дан 18 December 2019 в 14:44
поделиться

В fun () вы создаете отдельный объект, aa , а затем копируете значение ссылки на объект, возвращаемой a :: instance () ему через оператор присваивания. Это не сработает, потому что и конструктор, и деструктор являются закрытыми. aa должно быть ссылкой:

a &aa = a::instance();
4
ответ дан 18 December 2019 в 14:44
поделиться

Когда будет достигнут конец fun (), ваша переменная выйдет из области видимости и будет вызван деструктор.

Похоже, вы пытаетесь реализовать синглтон - возможно, вы имеете в виду это?

a & aa = a :: instance ();

Если aa является ссылкой, а не экземпляром, то деструктор победил ' t будет вызываться в конце fun ().

2
ответ дан 18 December 2019 в 14:44
поделиться

Это просто ошибка VC6. VC6 очень глючный. Вы можете использовать std::auto_ptr<> в качестве обходного пути.

#include <memory>

class X
{
    friend std::auto_ptr<X>;
public:
    static X& instance()
    {
        static std::auto_ptr<X> database(new X);
        return *database;
    }
.....
};

И, пожалуйста, перенесите реализацию instance() в файл cpp. Извините, я не помню точного случая, но есть еще один баг VC6 с реализацией синглтонов в заголовочных файлах. У нас было несколько аварий несколько лет назад, когда мы использовали VC6. Исправление заключалось в переносе имплементации instance() в cpp.

0
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: