Re[2]: Статическая переменная в классе???
От: GarryIV  
Дата: 08.10.04 14:32
Оценка: :)))
Hello, ScorpZ!

S> // !!!!!!!!!!!!! СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ КЛАССА (ЗА ОЧЕНЬ РЕДКИМ

S> ИСКЛЮЧЕНИЕМ // КОНСТАНТЫ ЦЕЛОГО ТИПА ) // ИНИЦИАЛИЗИРУЮТСЯ ВНЕ ТЕЛА
S> КЛАССА , В ГЛОБАЛЬНОЙ ОБЛАСТИ ВИДИМОСТИ // ЗАПОМИ .

Не надо так орать. Тут не глухие.

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 gamma
WBR, Igor Evgrafov
Статическая переменная в классе???
От: Аноним  
Дата: 08.10.04 10:36
Оценка:
Есть такой класс (фрагмент):

class PlanetTranay
{
static ofstream logfile;

public:
//
...
};

переменная logfile — для log-файла по всем объектам этого класса. Как ее проинициализировать?
Например, так:

PlanetTranay::PlanetTranay(void)
{
if (!logfile)
{
logfile.clear();
logfile.open("c:\\pt.txt", ios::out);

...
}
}

PlanetTranay::PlanetTranay(int Var1, int Var2)
{
VarIntPrivate1 = Var1;
VarIntPrivate2 = Var2;
}


PlanetTranay::~PlanetTranay(void)
{
if (logfile)
{
if (!logfile.fail())
{
logfile.flush();
logfile.close();
logfile = NULL;
}
}
}
Re: Статическая переменная в классе???
От: Аноним  
Дата: 08.10.04 10:42
Оценка:
Извиняюсь, вот так надо было написать:

Есть такой класс (фрагмент):

class PlanetTranay
{
static ofstream logfile;

public:
//
...
};

переменная logfile — для log-файла по всем объектам этого класса. Как ее проинициализировать?
Например, так:

PlanetTranay::PlanetTranay(void)
{
if (!logfile)
{
logfile.clear();
logfile.open("c:\\pt.txt", ios::out);

...
}
}


PlanetTranay::~PlanetTranay(void)
{
if (logfile)
{
if (!logfile.fail())
{
logfile.flush();
logfile.close();
}
}
}
Re[2]: Статическая переменная в классе???
От: just_bear Россия  
Дата: 08.10.04 11:04
Оценка:
Здравствуйте, Аноним, Вы писали:

Можно сэмулировать статический конструктор (конструктор класса) из С#. Например, так (примите как набросок):


#define STATIC_CTOR(x) static Initiator<x> m_initiator;

template<class Initable>
class Initiator
{
public:
 Initiator(){Initable::init();}
};


class A
{
  STATIC_CTOR(A);
  static void init(){.../*здесь инициализация*/}
...
};
Re[2]: Статическая переменная в классе???
От: jazzer Россия Skype: enerjazzer
Дата: 08.10.04 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Извиняюсь, вот так надо было написать:


А>Есть такой класс (фрагмент):


А>class PlanetTranay

А>{
А> static ofstream logfile;

А>public:

А>//
А>...
А>};

А>переменная logfile — для log-файла по всем объектам этого класса. Как ее проинициализировать?

А>Например, так:

А>PlanetTranay::PlanetTranay(void)

А>{
А> if (!logfile)
А> {
А> logfile.clear();
А> logfile.open("c:\\pt.txt", ios::out);

А>...

А> }
А>}


А>PlanetTranay::~PlanetTranay(void)

А>{
А> if (logfile)
А> {
А> if (!logfile.fail())
А> {
А> logfile.flush();
А> logfile.close();
А> }
А> }
А>}

проблема твоего класса в том, что logfile создастся при первом вызове конструктора, а умрет при первом вызове деструктора, а должен при последнем.
Посему обычно рядом кладется статический счетчик, который инкрементится в конструкторе и декрементится в деструкторе.
т.о. когда вызовется последний деструктор, счетчик обнулится и ты спокойно грохнешь свой logfile

Похожая идея работает с глобальными объектами cin, cout и т.п.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Статическая переменная в классе???
От: Batiskaf Израиль http://www.mult.ru/
Дата: 08.10.04 11:33
Оценка:
Здравствуйте, just_bear, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


_>Можно сэмулировать статический конструктор (конструктор класса) из С#. Например, так (примите как набросок):


_>

_>#define STATIC_CTOR(x) static Initiator<x> m_initiator;

_>template<class Initable>
_>class Initiator
_>{
_>public:
_> Initiator(){Initable::init();}
_>};


_>class A
_>{
_>  STATIC_CTOR(A);
_>  static void init(){.../*здесь инициализация*/}
_>...
_>};

_>


Можно и без лишних статиков обойтись, с ними всегда проблема:


template<typename T>
struct StaticConstructor
{
    template<typename T>
    struct StaticConstructorInner
    {
        StaticConstructorInner()
        {
            T::init();
        }

        ~StaticConstructorInner()
        {
            T::release();
        }
    };

    StaticConstructor()
    {
        static StaticConstructorInner<T> ctor;
    }
};

class A : public StaticConstructor<A>
{
public:
void init(){}
void release(){}
};


И потом стоит подумать заводить ли статик для лога, может стоит это зацентрализовать в каком то синглтоне глобальном, с кучей других сервисов, упрозающих лог, наверняка логи пригодятся не только в классе PlanetTranay.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[4]: Статическая переменная в классе???
От: Batiskaf Израиль http://www.mult.ru/
Дата: 08.10.04 11:37
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>class A : public StaticConstructor<A>

B>{
B>public:
B>static void init(){}
B>static void release(){}
B>};
B>[/ccode]

нужно отметить так же что статическое конструирование будет производиться только на момент первого создания экземпляра класса А, зато меньше будет проблем с определением статических членов класса (на одно меньше).
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re: Статическая переменная в классе???
От: ScorpZ Украина  
Дата: 08.10.04 13:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой класс (фрагмент):


А>class PlanetTranay

А>{
А> static ofstream logfile;

А>public:

А>//
А>...
А>};

А>переменная logfile — для log-файла по всем объектам этого класса. Как ее проинициализировать?

А>Например, так:

А>PlanetTranay::PlanetTranay(void)

А>{
А> if (!logfile)
А> {
А> logfile.clear();
А> logfile.open("c:\\pt.txt", ios::out);

А>...

А> }
А>}

А>PlanetTranay::PlanetTranay(int Var1, int Var2)

А>{
А> VarIntPrivate1 = Var1;
А> VarIntPrivate2 = Var2;
А>}


А>PlanetTranay::~PlanetTranay(void)

А>{
А> if (logfile)
А> {
А> if (!logfile.fail())
А> {
А> logfile.flush();
А> logfile.close();
А> logfile = NULL;
А> }
А> }
А>}


// !!!!!!!!!!!!! СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ КЛАССА (ЗА ОЧЕНЬ РЕДКИМ ИСКЛЮЧЕНИЕМ // КОНСТАНТЫ ЦЕЛОГО ТИПА )
// ИНИЦИАЛИЗИРУЮТСЯ ВНЕ ТЕЛА КЛАССА , В ГЛОБАЛЬНОЙ ОБЛАСТИ ВИДИМОСТИ
// ЗАПОМИ .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.