Следующий код хорошо работает для 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'
Пересмотренный пример показывает подтвержденную ошибку компилятора для VC6 - обычным обходным решением было просто сделать деструктор публичным.
В fun ()
вы создаете отдельный объект, aa
, а затем копируете значение ссылки на объект, возвращаемой a :: instance ()
ему через оператор присваивания. Это не сработает, потому что и конструктор, и деструктор являются закрытыми. aa
должно быть ссылкой:
a &aa = a::instance();
Когда будет достигнут конец fun (), ваша переменная выйдет из области видимости и будет вызван деструктор.
Похоже, вы пытаетесь реализовать синглтон - возможно, вы имеете в виду это?
a & aa = a :: instance ();
Если aa является ссылкой, а не экземпляром, то деструктор победил ' t будет вызываться в конце fun ().
Это просто ошибка 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.