Статическая переменная в классе???
От: Аноним  
Дата: 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;
А> }
А> }
А>}


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