Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 22.06.05 14:49
Оценка:
Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...

class CSettings
{
    static CSettings * s_pSettings = NULL;
};
Re: Инициализация статических членов класса
От: _DAle_ Беларусь  
Дата: 22.06.05 14:54
Оценка: 2 (1)
Здравствуйте, Anton0682, Вы писали:

A>Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...


A>
A>class CSettings
A>{
A>    static CSettings * s_pSettings = NULL;
A>};
A>


The declaration of a static data member in its class definition is not a definition and may be of an incomplete type other than cv-qualified void. The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition. In the definition at namespace scope, the name of the static data member shall be qualified by its class name using the :: operator.


class CSettings
{
    static CSettings * s_pSettings;
};

CSettings* CSettings::s_pSettings = NULL;
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[2]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 22.06.05 15:01
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>

The declaration of a static data member in its class definition is not a definition and may be of an incomplete type other than cv-qualified void. The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition. In the definition at namespace scope, the name of the static data member shall be qualified by its class name using the :: operator.


Понял. Спасибо.
Жаль. Было бы красиво.
Re: Инициализация статических членов класса
От: Bell Россия  
Дата: 22.06.05 15:02
Оценка:
Здравствуйте, Anton0682, Вы писали:

A>Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...


A>
A>class CSettings
A>{
A>    static CSettings * s_pSettings = NULL;
A>};
A>


Так можно инициализировать только статические константы интегральных типов. Очевидно, что это не тот случай.
Подробности, например, в 9.4.2/4.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Инициализация статических членов класса
От: Bell Россия  
Дата: 22.06.05 15:05
Оценка: +1
Здравствуйте, _DAle_, Вы писали:

...

Интегральные статические константы так инициализировать можно. Например вот это
class CSettings
{
    static const int i = 123;
};


вполне корректный код.
Впрочем, VC6 так делать все равно не позволяет...
Любите книгу — источник знаний (с) М.Горький
Re[3]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 22.06.05 15:08
Оценка:
Здравствуйте, Bell, Вы писали:

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


B>...


B>Интегральные статические константы так инициализировать можно. Например вот это

B>
B>class CSettings
B>{
B>    static const int i = 123;
B>};
B>


B>вполне корректный код.

B>Впрочем, VC6 так делать все равно не позволяет...

Все равно мне не константа нужна...
Re[4]: Инициализация статических членов класса
От: Кодт Россия  
Дата: 22.06.05 17:13
Оценка:
Здравствуйте, Anton0682, Вы писали:

A>Все равно мне не константа нужна...

class CSettings
{
public:
  static CSettings* & instance() { CSettings* var = NULL; return var; }
};

ну или там геттер-сеттер написать соответствующий.
Перекуём баги на фичи!
Re[5]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 22.06.05 17:21
Оценка:
Здравствуйте, Кодт, Вы писали:

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


A>>Все равно мне не константа нужна...

К>
К>class CSettings
К>{
К>public:
К>  static CSettings* & instance() { CSettings* var = NULL; return var; }
К>};
К>

К>ну или там геттер-сеттер написать соответствующий.

Я паттерн Singleton реализую. Мне кажется его без статического члена не сделаешь...
Re: Инициализация статических членов класса
От: ecco Россия  
Дата: 23.06.05 15:00
Оценка:
> Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...
>
>
> class CSettings
> {
> static CSettings * s_pSettings = NULL;
> };
>


Я где то в стандартах и(или) у Страуструпа видел (поищите если приспичило), что вроде как память глобальных статич. POD объектов (в т.ч. простых переменных) по умолчанию инициализируется нулями. В твоём случае это и надо. Так зачем огород городить ?
Posted via RSDN NNTP Server 1.9
Re[2]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 23.06.05 15:06
Оценка:
Здравствуйте, ecco, Вы писали:


>> Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...

>>
>>
>> class CSettings
>> {
>> static CSettings * s_pSettings = NULL;
>> };
>>


E>Я где то в стандартах и(или) у Страуструпа видел (поищите если приспичило), что вроде как память глобальных статич. POD объектов (в т.ч. простых переменных) по умолчанию инициализируется нулями. В твоём случае это и надо. Так зачем огород городить ?


Не знал. Спасибо. Поищу точную информацию...
Re[2]: Инициализация статических членов класса
От: ecco Россия  
Дата: 23.06.05 15:18
Оценка:
> Я где то в стандартах и(или) у Страуструпа видел (поищите если приспичило), что вроде как память глобальных статич. POD объектов (в т.ч. простых переменных) по умолчанию инициализируется нулями. В твоём случае это и надо. Так зачем огород городить ?
Извиняюсь, чуток очепятнулся. Вместо "глобальных статич. POD объектов" хотел "глобальных POD объектов".
Posted via RSDN NNTP Server 1.9
Re: Инициализация статических членов класса
От: mukos СССР  
Дата: 24.06.05 08:52
Оценка:
Здравствуйте, Anton0682, Вы писали:

A>Можно так инициализировать? Вроде очевидный синтаксис. А MSVC 6 не позволяет...


A>[ccode]

A>class CSettings
A>{
A> static CSettings * s_pSettings = NULL;
A>};
A>[/ccod]
Насколько я знаю обьявление статической переменной не есть выделение под нее памяти
поэтому и присвоить ей значение нельзя
Для этого в срр файле типа так
int a::i;
Re[6]: Инициализация статических членов класса
От: jdan  
Дата: 24.06.05 10:25
Оценка:
Здравствуйте, Anton0682, Вы писали:

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


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


A>>>Все равно мне не константа нужна...

К>>
К>>class CSettings
К>>{
К>>public:
К>>  static CSettings* & instance() { CSettings* var = NULL; return var; }
К>>};
К>>

К>>ну или там геттер-сеттер написать соответствующий.

A>Я паттерн Singleton реализую. Мне кажется его без статического члена не сделаешь...


Сделаешь, пример:
создаешь свой класс CSettings и указываешь ему friend-а, а уже в friend-е твори что хочешь.
Да и про реализации design pattern-ов очень много написано.
Re[7]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 24.06.05 10:35
Оценка:
Здравствуйте, jdan, Вы писали:

A>>Я паттерн Singleton реализую. Мне кажется его без статического члена не сделаешь...


J>Сделаешь, пример:

J>создаешь свой класс CSettings и указываешь ему friend-а, а уже в friend-е твори что хочешь.
J>Да и про реализации design pattern-ов очень много написано.

Я хотел реализовать singleton целиком внутри определения класса.
Если ты знаешь как это сделать, то скажи пожалуйста поконкретнее.
Re[5]: Инициализация статических членов класса
От: WoldemaR Россия  
Дата: 24.06.05 10:37
Оценка: 2 (1)
Здравствуйте, Кодт, Вы писали:

Маленькое такое замечание:
К>class CSettings
К>{
К>public:
К>  static CSettings* & instance() { static CSettings* var = NULL; return var; }
К>};
К>
Re[6]: Инициализация статических членов класса
От: Anton0682 Россия  
Дата: 24.06.05 10:48
Оценка:
Здравствуйте, WoldemaR, Вы писали:

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


WR>Маленькое такое замечание:

WR>
К>>class CSettings
К>>{
К>>public:
К>>  static CSettings* & instance() { static CSettings* var = NULL; return var; }
К>>};
К>>


Вот теперь до меня дошло!
Полный вариант:


class CSettings
{
public:
    static CSettings & GetSettings()
    {
        static CSettings * s_pSettings = NULL;

        if (! s_pSettings)
        {
            s_pSettings = new CSettings;
        }

        return *s_pSettings;
    }
}
Re[7]: Инициализация статических членов класса
От: WoldemaR Россия  
Дата: 24.06.05 11:04
Оценка: 1 (1)
Здравствуйте, Anton0682, Вы писали:

Достаточно такого:
class CSettings
{
public:
    static CSettings & GetSettings()
    {
        static CSettings* s_pSettings = new CSettings;
        return *s_pSettings;
    }
}

Инициализация всё равно пройдёт один раз.
Re[8]: Инициализация статических членов класса
От: WoldemaR Россия  
Дата: 24.06.05 11:33
Оценка:
Здравствуйте, WoldemaR, Вы писали:


Кстати этот код тоже не фонтан.
удялять то экземпляр CSettings — некому.

WR>
WR>class CSettings
WR>{
WR>public:
WR>    static CSettings & GetSettings()
WR>    {
WR>        static CSettings* s_pSettings = new CSettings;
WR>        return *s_pSettings;
WR>    }
WR>}
WR>


следовательно надо либо создавать экземпляр не динамически, а так:
static CSettings& GetSettings()
{
    static CSettings s_Settings;
    return s_Settings;
}


либо обернуть указатель в умный указатель-владелец, отвечающий за удаление объекта.
Типо такого:
static CSettings& GetSettings()
{
    static std::auto_ptr<CSettings> s_pSettings = new CSettings;
    return *s_pSettings;
}
Re[3]: Инициализация статических членов класса
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.06.05 12:01
Оценка:
E>Извиняюсь, чуток очепятнулся. Вместо "глобальных статич. POD объектов" хотел "глобальных POD объектов".
Да все равно мимо. Если он ее только объявит, то потом очень удивиться при линковке.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Инициализация статических членов класса
От: ecco Россия  
Дата: 24.06.05 14:59
Оценка:
> Да все равно мимо. Если он ее только объявит, то потом очень удивиться при линковке.
Не придирайтесь по мелочам, наличие определения подразумевалось. :-[
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.