Ошибка компилятора (MSVS 6.0)
C:\projects\test_env\quicktest\test1\test.cpp(18) : error C2248: 'TestManager::~TestManager' : cannot access private member declared in class 'TestManager'
C:\projects\test_env\quicktest\test1\test.cpp(15) : see declaration of 'TestManager::~TestManager'
DEN>>Ошибка компилятора (MSVS 6.0) DEN>> DEN>>C:\projects\test_env\quicktest\test1\test.cpp(18) : error C2248: 'TestManager::~TestManager' : cannot access private member declared in class 'TestManager' DEN>> C:\projects\test_env\quicktest\test1\test.cpp(15) : see declaration of 'TestManager::~TestManager' DEN>>
D>Поясни, чего это конструктор и деструктор — в приватах?
стандартная реализация синглетона. http://www.rsdn.ru/article/patterns/singleton.xml
DEN>Ошибка компилятора (MSVS 6.0) DEN> DEN>C:\projects\test_env\quicktest\test1\test.cpp(18) : error C2248: 'TestManager::~TestManager' : cannot access private member declared in class 'TestManager' DEN> C:\projects\test_env\quicktest\test1\test.cpp(15) : see declaration of 'TestManager::~TestManager' DEN>
100% проблема в этом коде? Даже без номеров строк, строки 15 и 18 никак не соотносятся с определем деструктора и еще чем-то. Может быть, ты наследуешься от этого класса, или что-то еще? Может быть пытаешься сказать так: TestManager tm = TestManager::instance() ?
Здравствуйте, DENIVA, Вы писали:
DEN>Здравствуйте, denaturat, Вы писали:
D>>[] D>>и где ты там увидел секцию private ?
DEN>ну замени на protected суть от этого не меняется
Не обманывай:
// test_sngl.cpp : Defines the entry point for the console application.
//#include"stdafx.h"class CTest
{
protected:
CTest(){}
~CTest(){}
static CTest * m_self;
public:
static CTest* AddRef() { m_self = new CTest(); return m_self; }
static void Release() { delete m_self; }
};
CTest* CTest::m_self = 0;
int _tmain(int argc, _TCHAR* argv[])
{
CTest * p = CTest::AddRef();
CTest::Release();
return 0;
}
Конструктор и деструктор объявляются закрытыми, чтоб мы могли управлять созданием и удалением объекта. Для создания и удаления используются статические (public) методы этого класса, поскольку только в них можно вызвать new и delete (читай: конструктор и деструктор).
Здравствуйте, denaturat, Вы писали:
D>Здравствуйте, DENIVA, Вы писали:
DEN>>Здравствуйте, denaturat, Вы писали:
D>>>[] D>>>и где ты там увидел секцию private ?
DEN>>ну замени на protected суть от этого не меняется
D>Не обманывай:
D>
Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел.
может нужны какие define или флажки для компиляции сделать.
Здравствуйте, denaturat, Вы писали:
D>Впрочем, сработает и private D>Короче, суть метода:
D>Конструктор и деструктор объявляются закрытыми, чтоб мы могли управлять созданием и удалением объекта. Для создания и удаления используются статические (public) методы этого класса, поскольку только в них можно вызвать new и delete (читай: конструктор и деструктор).
Вопрос был в том, почему компилятором выдается ошибка а не в том, что делает код.
Здравствуйте, HiSH, Вы писали:
HSH>Здравствуйте, DENIVA, Вы писали:
HSH>100% проблема в этом коде? Даже без номеров строк, строки 15 и 18 никак не соотносятся с определем деструктора и еще чем-то. Может быть, ты наследуешься от этого класса, или что-то еще? Может быть пытаешься сказать так: TestManager tm = TestManager::instance() ?
Я хочу просто скомпилировать приведенный код и получить объектник.
DEN>Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел. DEN>может нужны какие define или флажки для компиляции сделать.
Разницы быть не должно, просто ты не дал весь пример, а дал только определение класса. Посмотри мою ветку (суть) после примера.
Судя по ошибке, я предположил, что экземпляр твоего класса создается при помощи оператора new в программе, а не с помощью спец. метода класса.
Здравствуйте, denaturat, Вы писали:
D>Здравствуйте, DENIVA, Вы писали:
DEN>>Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел. DEN>>может нужны какие define или флажки для компиляции сделать.
D>Разницы быть не должно, просто ты не дал весь пример, а дал только определение класса. Посмотри мою ветку (суть) после примера. D>Судя по ошибке, я предположил, что экземпляр твоего класса создается при помощи оператора new в программе, а не с помощью спец. метода класса.
В том то и дело что нет. Это ВЕСЬ пример. Я создал файл. Его содержимое я прислал. Включил в проект и нажал Ctrl-F7
Здравствуйте, DENIVA, Вы писали:
DEN>Здравствуйте, denaturat, Вы писали:
D>>Здравствуйте, DENIVA, Вы писали:
DEN>В том то и дело что нет. Это ВЕСЬ пример. Я создал файл. Его содержимое я прислал. Включил в проект и нажал Ctrl-F7
Ну тогда придется подождать того, у кого есть VS6, поскольку в VS2005 все нормально.
Compiling...
2.cpp
D:\Projects\2\2.cpp(25) : error C2248: 'TestManager::~TestManager' : cannot access private member declared in class 'TestManager'
D:\Projects\2\2.cpp(22) : see declaration of 'TestManager::~TestManager'
Error executing cl.exe.
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, L2-Max, Вы писали:
LM>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, L2-Max, Вы писали:
LM>>Здравствуйте, L2-Max, Вы писали:
LM>>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.
КЛ>нормально будет разрушаться
ХМ, интересно ваше мнение. А почему стандарт говорит обратное ?
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, Константин Л., Вы писали:
КЛ>>Здравствуйте, L2-Max, Вы писали:
LM>>>Здравствуйте, L2-Max, Вы писали:
LM>>>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.
КЛ>>нормально будет разрушаться
LM>ХМ, интересно ваше мнение. А почему стандарт говорит обратное ?
Думаю, самый простой выход — объявить деструктор public и страться нигде
не удалять объект вручную А дело, наверное, в том, что пкомпилер
порождает код деинициализации, из котрого деструктор "не виден".
В стандарте я нашёл только такое упоминание об видимости деструктора
(12.4.10):
[quote]A program is ill-formed if the destructor for an object is
implicitly used and it is not accessible.[/quote]
> В стандарте я нашёл только такое упоминание об видимости деструктора > (12.4.10): > [quote]A program is ill-formed if the destructor for an object is > implicitly used and it is not accessible.[/quote]
Хотя я ошибся, это в черночике стандарта от 97 года.
В самом стандарте написано, что деструктор должен быть доступен в точке
объявления переменной. Но видимо msvc6 следует тому, что было написано в
черновике и лучший выход (если забыть о возможности смены компилятора) —
оставить конструктор приватным и сделать публичным деструктор.
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, L2-Max, Вы писали:
LM>Кстати, вы можете определить статическую переменную типа вашего класса гденибудь в скопе срр файла, получите аналогичную ошибку только о конструкторе.
Здравствуйте, green.nsk, Вы писали:
>> В стандарте я нашёл только такое упоминание об видимости деструктора >> (12.4.10): >> [quote]A program is ill-formed if the destructor for an object is >> implicitly used and it is not accessible.[/quote]
GN>Хотя я ошибся, это в черночике стандарта от 97 года. GN>В самом стандарте написано, что деструктор должен быть доступен в точке GN>объявления переменной. Но видимо msvc6 следует тому, что было написано в GN>черновике и лучший выход (если забыть о возможности смены компилятора) — GN>оставить конструктор приватным и сделать публичным деструктор.
Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
Здравствуйте, DENIVA, Вы писали:
DEN>Здравствуйте, green.nsk, Вы писали:
>>> В стандарте я нашёл только такое упоминание об видимости деструктора >>> (12.4.10): >>> [quote]A program is ill-formed if the destructor for an object is >>> implicitly used and it is not accessible.[/quote]
GN>>Хотя я ошибся, это в черночике стандарта от 97 года. GN>>В самом стандарте написано, что деструктор должен быть доступен в точке GN>>объявления переменной. Но видимо msvc6 следует тому, что было написано в GN>>черновике и лучший выход (если забыть о возможности смены компилятора) — GN>>оставить конструктор приватным и сделать публичным деструктор.
DEN>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
Проблем, в этом плане, в компиляторе нет. Он правильно ругается.
Если конструктор приватный:
Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом.
С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, DENIVA, Вы писали:
DEN>>Здравствуйте, green.nsk, Вы писали:
DEN>>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
LM>Проблем, в этом плане, в компиляторе нет. Он правильно ругается. LM>Если конструктор приватный: LM>Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом. LM>С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...
почитай верние топики. В VS 2003 все работает. Эта проблема только в VS 6.0
Здравствуйте, DENIVA, Вы писали:
DEN>Здравствуйте, L2-Max, Вы писали:
LM>>Здравствуйте, DENIVA, Вы писали:
DEN>>>Здравствуйте, green.nsk, Вы писали:
DEN>>>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
LM>>Проблем, в этом плане, в компиляторе нет. Он правильно ругается. LM>>Если конструктор приватный: LM>>Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом. LM>>С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...
DEN>почитай верние топики. В VS 2003 все работает. Эта проблема только в VS 6.0
Проблема VS6 в том, что он придерживается стандарта ? Кстати, все студии позволяют видеть индексную переменную оператора for в следующем скопе, а вот GCC не позволяет — значит он имеет проблемы ?
Кстати, по поводу того что в VS2003 нормально тоже сомневаюсь, не должен он такое допускать. Скорее всего, что создавали объект динамически и не удаляли. (под рукой нет VS2003 проверить не могу).
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, DENIVA, Вы писали:
DEN>>Здравствуйте, L2-Max, Вы писали:
LM>>>Здравствуйте, DENIVA, Вы писали:
DEN>>>>Здравствуйте, green.nsk, Вы писали:
DEN>>>>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
LM>>>Проблем, в этом плане, в компиляторе нет. Он правильно ругается. LM>>>Если конструктор приватный: LM>>>Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом. LM>>>С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...
DEN>>почитай верние топики. В VS 2003 все работает. Эта проблема только в VS 6.0
В любом случае приведенный вами в пример синглтон не правильный, с точки зрения шаблонов проектирования.
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, L2-Max, Вы писали:
LM>>Здравствуйте, DENIVA, Вы писали:
DEN>>>Здравствуйте, L2-Max, Вы писали:
LM>>>>Здравствуйте, DENIVA, Вы писали:
DEN>>>>>Здравствуйте, green.nsk, Вы писали:
DEN>>>>>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается
LM>>>>Проблем, в этом плане, в компиляторе нет. Он правильно ругается. LM>>>>Если конструктор приватный: LM>>>>Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом. LM>>>>С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...
DEN>>>почитай верние топики. В VS 2003 все работает. Эта проблема только в VS 6.0
LM>В любом случае приведенный вами в пример синглтон не правильный, с точки зрения шаблонов проектирования.