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

Конструктор и деструктор объявляются закрытыми, чтоб мы могли управлять созданием и удалением объекта. Для создания и удаления используются статические (public) методы этого класса, поскольку только в них можно вызвать new и delete (читай: конструктор и деструктор).
Re[11]: проблема : error C2248
От: L2-Max Украина  
Дата: 14.11.06 12:19
Оценка: -1
Здравствуйте, L2-Max, Вы писали:

Кстати не фигня. Как по вашему будет разрушаться объект в CRT ? Деструктор то приватный. Для этого надо использовать new и delete.
L2-Max
Re[6]: проблема : error C2248
От: L2-Max Украина  
Дата: 15.11.06 10:45
Оценка: -1
Здравствуйте, 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
проблема : 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]: проблема : 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[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>>
Re[14]: проблема : error C2248
От: green.nsk  
Дата: 15.11.06 06:08
Оценка:
а где стандарт говорит обратное?
Posted via RSDN NNTP Server 2.0
Re: проблема : error C2248
От: green.nsk  
Дата: 15.11.06 06:08
Оценка:
Думаю, самый простой выход — объявить деструктор 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]
Posted via RSDN NNTP Server 2.0
Re[2]: проблема : error C2248
От: green.nsk  
Дата: 15.11.06 09:04
Оценка:
> В стандарте я нашёл только такое упоминание об видимости деструктора
> (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 следует тому, что было написано в
черновике и лучший выход (если забыть о возможности смены компилятора) —
оставить конструктор приватным и сделать публичным деструктор.
Posted via RSDN NNTP Server 2.0
Re[13]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 15.11.06 09:24
Оценка:
Здравствуйте, L2-Max, Вы писали:

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


LM>Кстати, вы можете определить статическую переменную типа вашего класса гденибудь в скопе срр файла, получите аналогичную ошибку только о конструкторе.


ну с конструктором понятно. Это же singleton.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 15.11.06 09:24
Оценка:
Здравствуйте, 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 стоит, но все равно проблема остается
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: проблема : error C2248
От: L2-Max Украина  
Дата: 15.11.06 10:25
Оценка:
Здравствуйте, 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
Re[5]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 15.11.06 10:39
Оценка:
Здравствуйте, L2-Max, Вы писали:

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


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


DEN>>Я больше чем уверен — bug в компиляторе. Просто может патчи какие-есть? вроде у меня последний sp для VS стоит, но все равно проблема остается


LM>Проблем, в этом плане, в компиляторе нет. Он правильно ругается.

LM>Если конструктор приватный:
LM>Мы не можем создавать объект не методом-членом этого класса либо если это не друг этого класса. Глобальный скоп по определению не может являться ни другом ни членом класса, следовательно мы никогда не сможем создать этот объект глобальным скопом.
LM>С деструктором тоже самое, удалиться он скопом также не сможет если деструктор не паблик. Так что вот ...

почитай верние топики. В VS 2003 все работает. Эта проблема только в VS 6.0
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: проблема : error C2248
От: L2-Max Украина  
Дата: 15.11.06 10:48
Оценка:
Здравствуйте, 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
Re[8]: проблема : error C2248
От: DENIVA Россия http://www.uml3.ru
Дата: 15.11.06 10:57
Оценка:
Здравствуйте, 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>В любом случае приведенный вами в пример синглтон не правильный, с точки зрения шаблонов проектирования.


Полный код тут — http://sourceforge.net/projects/quicktest

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