Ошибка компилятора (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>ХМ, интересно ваше мнение. А почему стандарт говорит обратное ?