Посчитать объекты?
От: DukeNukem3D Россия  
Дата: 17.07.08 05:37
Оценка:
Есть класс:

class clsTime
{

    private:

        short siHH, siSS, siMM;
                
    public:
        
        clsTime() : siHH ( 0 ), siMM ( 0 ), siSS ( 0 )
        {

        }

        clsTime ( short h, short m, short s ) : siHH ( h ), siMM ( m ), siSS ( s )
        {

        }

        void <...>

};



Я хочу посчитать сколько объектов создано под этим классом. Вроде бы всё просто — добавляем свойства:


class clsTime
{

    private:

        <...>
        static unsigned int uiCounter;
        unsigned int uiNum;


А в конструкторах пишем:


    <...>
    public:
        
        clsTime() : siHH ( 0 ), siMM ( 0 ), siSS ( 0 )
        {
            uiCounter++;
            uiNum = uiCounter;
        }

        clsTime ( short h, short m, short s ) : siHH ( h ), siMM ( m ), siSS ( s )
        {
            uiCounter++;
            uiNum = uiCounter;
        }

    <...>


Получается, что uiNum и будет показывать порядковый номер вновь созданного объекта, однако при записи:

TimeObj3 = TimeObj1 + TimeObj2;


Номер TimeObj3 инкрементируется и становится равным не 3, а 4.

Как сделать правильно?
С уважением, Андрей
Re: Посчитать объекты?
От: Ovl Россия  
Дата: 17.07.08 05:41
Оценка:
DND>Как сделать правильно?

сделать конструктор и копировать счетчик оттуда

clsTime(const clsTime & r) {
   this.uiNum = r.uiNum;
   // other stuff
}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: Посчитать объекты?
От: Ovl Россия  
Дата: 17.07.08 05:44
Оценка:
Здравствуйте, Ovl, Вы писали:

DND>>Как сделать правильно?


Ovl>сделать конструктор и копировать счетчик оттуда


Ovl>
Ovl>clsTime(const clsTime & r) {
Ovl>   this.uiNum = r.uiNum;
Ovl>   // other stuff
Ovl>}
Ovl>


но все равно это не спасет от ситуация типа. хотя и уберет проблему с временными объектами.

clsTime a;
clsTime b = a;


чем не устраивает текущий вариант (с 4-кой вместо 3-ки)?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Посчитать объекты?
От: Bell Россия  
Дата: 17.07.08 06:00
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:


DND>Я хочу посчитать сколько объектов создано под этим классом. Вроде бы всё просто — добавляем свойства:

...
DND>А в конструкторах пишем:
...

DND>Получается, что uiNum и будет показывать порядковый номер вновь созданного объекта, однако при записи:


DND>
DND>TimeObj3 = TimeObj1 + TimeObj2;
DND>


DND>Номер TimeObj3 инкрементируется и становится равным не 3, а 4.


Не упомянут конструктор копирования, хотя судя по всему он реализован, и счетчик в нем инкрементируется...

DND>Как сделать правильно?

Никак — ты не сможешь контролировать создание временных объектов.

Расскажи лучше, что именно тебе нужно.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Посчитать объекты?
От: Аноним  
Дата: 17.07.08 06:01
Оценка:
Здравствуйте, Ovl, Вы писали:

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


DND>>>Как сделать правильно?


Ovl>>сделать конструктор и копировать счетчик оттуда


Ovl>>
Ovl>>clsTime(const clsTime & r) {
Ovl>>   this.uiNum = r.uiNum;
Ovl>>   // other stuff
Ovl>>}
Ovl>>


Ovl>но все равно это не спасет от ситуация типа. хотя и уберет проблему с временными объектами.


Ovl>
Ovl>clsTime a;
Ovl>clsTime b = a;
Ovl>


Ovl>чем не устраивает текущий вариант (с 4-кой вместо 3-ки)?


вот этим:

for ( int i=1; i<60; i++)
{
      clsTime b = a;
}


Каким будет номер объекта в этом случае?
Re[2]: Посчитать объекты?
От: DukeNukem3D Россия  
Дата: 17.07.08 06:07
Оценка:
Здравствуйте, Bell, Вы писали:

B>Не упомянут конструктор копирования, хотя судя по всему он реализован, и счетчик в нем инкрементируется...


Конструктор копирования я не писал, пользуюсь конструктором по умолчанию.

B>Расскажи лучше, что именно тебе нужно.


Хочу просто чтобы у каждого объекта был свой порядковый номер, хранящийся в одном из полей и присваивался во время создания объекта, еще красивее было бы чтобы его нельзя было изменить.
С уважением, Андрей
Re[3]: Посчитать объекты?
От: Bell Россия  
Дата: 17.07.08 07:12
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:

B>>Не упомянут конструктор копирования, хотя судя по всему он реализован, и счетчик в нем инкрементируется...


DND>Конструктор копирования я не писал, пользуюсь конструктором по умолчанию.


Значит при конструировании копии не будет инкрементирован счетчик, и будет использовано значение из исходного объекта, т.е. в результате получатся объекты с дублирующимися номерами.

B>>Расскажи лучше, что именно тебе нужно.


DND>Хочу просто чтобы у каждого объекта был свой порядковый номер, хранящийся в одном из полей и присваивался во время создания объекта...


Значит строгая последовательность номеров не важна?

DND>...еще красивее было бы чтобы его нельзя было изменить.


class Test
{
   const int id_;
   static int counter_;

public:
   Test() : id_(counter_++) {}
   Test(const Test& t) : id_(counter_++) {}
};

int Test::counter_ = 0;
Любите книгу — источник знаний (с) М.Горький
Re: Посчитать объекты?
От: ulong Россия  
Дата: 17.07.08 09:37
Оценка:
есть вариант со смарт поинтерами.
в этом случае временных объектов не будет.
примерно так:

class A;
typedef boost::shared_ptr<A> APtr;

class A
{
    A() { ++ Count; }
    A( const A& );
    A& operator=( const A& );
    static unsigned Count;
public:
    static APtr create() { return APtr( new A() ); }
};

unsigned A::Count = 0;

...

APtr p1( A::create() );
APtr p2 = p1;
APtr p3( A::create() );
p1 = p3;
assert( 2 == A::Count );
Re: Посчитать объекты?
От: Vamp Россия  
Дата: 17.07.08 13:43
Оценка:
DND>Я хочу посчитать сколько объектов создано под этим классом. Вроде бы всё просто — добавляем свойства:
Ну ты и считаешь, все правильно. Просто временный объект — это тоже объект.
Да здравствует мыло душистое и веревка пушистая.
Re: Посчитать объекты?
От: Greg Zubankov СССР  
Дата: 18.07.08 06:59
Оценка: +3
Здравствуйте, DukeNukem3D, Вы писали:

DND>Есть класс:

DND>Как сделать правильно?
Воспользуйся фабричной функцией для создания объектов. В ней и считай их количество.
Re: Посчитать объекты?
От: Danchik Украина  
Дата: 18.07.08 15:10
Оценка: -1
Здравствуйте, DukeNukem3D, Вы писали:

[Skip]

DND>
DND>TimeObj3 = TimeObj1 + TimeObj2;
DND>


DND>Номер TimeObj3 инкрементируется и становится равным не 3, а 4.


DND>Как сделать правильно?


Может перекрыть операторы new и delete и считать в них?
Тогда стековые ребята в счет не попадут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.