проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 09:22
Оценка:
Уверен, что проблема известная, но рылся-рылся, а решения не нашел
    class TestManager
    {
    public:
        static TestManager& instance()
        {
            static TestManager self;
            return self;
        }

    private:
        TestManager()
        {
        }

        ~TestManager()
        {
        }
    };

Ошибка компилятора (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'
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: проблема : error C2248
От: denaturat  
Дата: 14.11.06 09:32
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Уверен, что проблема известная, но рылся-рылся, а решения не нашел

DEN>
DEN>    class TestManager
DEN>    {
DEN>    public:
DEN>        static TestManager& instance()
DEN>        {
DEN>            static TestManager self;
DEN>            return self;
DEN>        }

DEN>    private:
DEN>        TestManager()
DEN>        {
DEN>        }

DEN>        ~TestManager()
DEN>        {
DEN>        }
DEN>    };
DEN>

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>


Поясни, чего это конструктор и деструктор — в приватах?
Re[2]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 09:39
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Здравствуйте, DENIVA, Вы писали:


DEN>>Уверен, что проблема известная, но рылся-рылся, а решения не нашел

DEN>>
DEN>>    class TestManager
DEN>>    {
DEN>>    public:
DEN>>        static TestManager& instance()
DEN>>        {
DEN>>            static TestManager self;
DEN>>            return self;
DEN>>        }

D>DEN>    private:
DEN>>        TestManager()
DEN>>        {
DEN>>        }

DEN>>        ~TestManager()
DEN>>        {
DEN>>        }
DEN>>    };
DEN>>

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
Автор(ы): Дмитрий Федоров
Дата: 14.11.2002
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: проблема : error C2248
От: denaturat  
Дата: 14.11.06 09:47
Оценка:
[]
и где ты там увидел секцию private ?
Re[4]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 09:53
Оценка:
Здравствуйте, denaturat, Вы писали:

D>[]

D>и где ты там увидел секцию private ?

ну замени на protected суть от этого не меняется
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: проблема : error C2248
От: HiSH Россия http://m0riarty.ya.ru
Дата: 14.11.06 10:01
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Уверен, что проблема известная, но рылся-рылся, а решения не нашел

DEN>
DEN>    class TestManager
DEN>    {
DEN>    public:
DEN>        static TestManager& instance()
DEN>        {
DEN>            static TestManager self;
DEN>            return self;
DEN>        }

DEN>    private:
DEN>        TestManager()
DEN>        {
DEN>        }

DEN>        ~TestManager()
DEN>        {
DEN>        }
DEN>    };
DEN>

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() ?
Re[5]: проблема : error C2248
От: denaturat  
Дата: 14.11.06 10:07
Оценка:
Здравствуйте, 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;
}



------ Build started: Project: test_sngl, Configuration: Debug Win32 ------
Compiling...
test_sngl.cpp
Linking...
Embedding manifest...
Build log was saved at "file://c:\Documents and Settings\darichev\Мои документы\Visual Studio 2005\Projects\test_sngl\test_sngl\Debug\BuildLog.htm"
test_sngl — 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Re[6]: суть
От: denaturat  
Дата: 14.11.06 10:12
Оценка: :)
Впрочем, сработает и private
Короче, суть метода:

Конструктор и деструктор объявляются закрытыми, чтоб мы могли управлять созданием и удалением объекта. Для создания и удаления используются статические (public) методы этого класса, поскольку только в них можно вызвать new и delete (читай: конструктор и деструктор).
Re[6]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 10:23
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Здравствуйте, DENIVA, Вы писали:


DEN>>Здравствуйте, denaturat, Вы писали:


D>>>[]

D>>>и где ты там увидел секцию private ?

DEN>>ну замени на protected суть от этого не меняется


D>Не обманывай:


D>

D>// test_sngl.cpp : Defines the entry point for the console application.
D>//

D>#include "stdafx.h"

D>class CTest
D>{
D>protected:
D>    CTest(){}
D>    ~CTest(){}
D>    static CTest * m_self;
D>public:
D>    static CTest* AddRef() { m_self = new CTest(); return m_self; }
D>    static void Release() { delete m_self; }
D>};

D>CTest* CTest::m_self = 0;

D>int _tmain(int argc, _TCHAR* argv[])
D>{
D>    CTest * p = CTest::AddRef();
D>    CTest::Release();
D>    return 0;
D>}

D>



D>

D>------ Build started: Project: test_sngl, Configuration: Debug Win32 ------
D>Compiling...
D>test_sngl.cpp
D>Linking...
D>Embedding manifest...
D>Build log was saved at "file://c:\Documents and Settings\darichev\Мои документы\Visual Studio 2005\Projects\test_sngl\test_sngl\Debug\BuildLog.htm"
D>test_sngl — 0 error(s), 0 warning(s)
D>========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел.
может нужны какие define или флажки для компиляции сделать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: суть
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 10:23
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Впрочем, сработает и private

D>Короче, суть метода:

D>Конструктор и деструктор объявляются закрытыми, чтоб мы могли управлять созданием и удалением объекта. Для создания и удаления используются статические (public) методы этого класса, поскольку только в них можно вызвать new и delete (читай: конструктор и деструктор).


Вопрос был в том, почему компилятором выдается ошибка а не в том, что делает код.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 10:24
Оценка:
Здравствуйте, HiSH, Вы писали:

HSH>Здравствуйте, DENIVA, Вы писали:




HSH>100% проблема в этом коде? Даже без номеров строк, строки 15 и 18 никак не соотносятся с определем деструктора и еще чем-то. Может быть, ты наследуешься от этого класса, или что-то еще? Может быть пытаешься сказать так: TestManager tm = TestManager::instance() ?


Я хочу просто скомпилировать приведенный код и получить объектник.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: проблема : error C2248
От: denaturat  
Дата: 14.11.06 10:28
Оценка:
Здравствуйте, DENIVA, Вы писали:


DEN>Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел.

DEN>может нужны какие define или флажки для компиляции сделать.

Разницы быть не должно, просто ты не дал весь пример, а дал только определение класса. Посмотри мою ветку (суть) после примера.
Судя по ошибке, я предположил, что экземпляр твоего класса создается при помощи оператора new в программе, а не с помощью спец. метода класса.
Re[8]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 14.11.06 10:35
Оценка:
Здравствуйте, denaturat, Вы писали:

D>Здравствуйте, DENIVA, Вы писали:



DEN>>Я создал проект в VS 6.0 (без всяких precompile header) и попробовал скомпилить пример, который я привел.

DEN>>может нужны какие define или флажки для компиляции сделать.

D>Разницы быть не должно, просто ты не дал весь пример, а дал только определение класса. Посмотри мою ветку (суть) после примера.

D>Судя по ошибке, я предположил, что экземпляр твоего класса создается при помощи оператора new в программе, а не с помощью спец. метода класса.

В том то и дело что нет. Это ВЕСЬ пример. Я создал файл. Его содержимое я прислал. Включил в проект и нажал Ctrl-F7
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: проблема : error C2248
От: denaturat  
Дата: 14.11.06 10:42
Оценка:
Здравствуйте, DENIVA, Вы писали:

DEN>Здравствуйте, denaturat, Вы писали:


D>>Здравствуйте, DENIVA, Вы писали:


DEN>В том то и дело что нет. Это ВЕСЬ пример. Я создал файл. Его содержимое я прислал. Включил в проект и нажал Ctrl-F7


Ну тогда придется подождать того, у кого есть VS6, поскольку в VS2005 все нормально.
Re[10]: проблема : error C2248
От: L2-Max Украина  
Дата: 14.11.06 12:05
Оценка:
Действительно, фигня какая то под VS6

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.

2.exe — 1 error(s), 0 warning(s)

L2-Max
Re[11]: проблема : error C2248
От: L2-Max Украина  
Дата: 14.11.06 12:19
Оценка: -1
Здравствуйте, L2-Max, Вы писали:

Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.
L2-Max
Re[12]: проблема : error C2248
От: L2-Max Украина  
Дата: 14.11.06 12:24
Оценка:
Здравствуйте, L2-Max, Вы писали:

Кстати, вы можете определить статическую переменную типа вашего класса гденибудь в скопе срр файла, получите аналогичную ошибку только о конструкторе.
L2-Max
Re[12]: проблема : error C2248
От: Константин Л. Франция  
Дата: 14.11.06 12:29
Оценка:
Здравствуйте, L2-Max, Вы писали:

LM>Здравствуйте, L2-Max, Вы писали:


LM>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.


нормально будет разрушаться
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: проблема : error C2248
От: L2-Max Украина  
Дата: 14.11.06 12:37
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, L2-Max, Вы писали:


LM>>Здравствуйте, L2-Max, Вы писали:


LM>>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.


КЛ>нормально будет разрушаться


ХМ, интересно ваше мнение. А почему стандарт говорит обратное ?
L2-Max
Re[14]: проблема : error C2248
От: Константин Л. Франция  
Дата: 14.11.06 14:17
Оценка:
Здравствуйте, L2-Max, Вы писали:

LM>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, L2-Max, Вы писали:


LM>>>Здравствуйте, L2-Max, Вы писали:


LM>>>Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.


КЛ>>нормально будет разрушаться


LM>ХМ, интересно ваше мнение. А почему стандарт говорит обратное ?


прошу прощения. Забыл про static
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.