Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 03.05.2004, 06:26   #1
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default Задача сложнее:

Господа, позволю себе предложить вам задачу не такую простую.
Требуется написать механизм, который будет подсчитывать количество экземпляров данного класса. Механизм, само собой, должен быть как можно более универсальным.
В задаче есть нюанс следующего рода:
PHP Code:
class {};
class 
: public {};
int main()
{
A a;
B b;

Сколько объектов А тут будет 1 или 2? Я считаю, что должно быть 2 объекта, но если у вас иное мнение на этот счет то прошу.

Жду решений.
Reply With Quote
Old 03.05.2004, 07:33   #2
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

а почему статический счетчик в базовом классе не подходит?
Reply With Quote
Old 03.05.2004, 07:47   #3
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

1. не общий механизм - завтра другой класс ( не говорю об иерархии) - писать снова - не хочется.
2. я не хочу только количество базовых, но так же и наследуемых классов.
Пример из жизни
PHP Code:
class Instance {};
class 
GateInstance : public Instance {};
class 
ModuleInstance : public Instance{}; 
теперь мне хочется знать не только сколько существует инстантированных сущностей, а конкретно сколько логических элементов и сколько модулей.
Reply With Quote
Old 03.05.2004, 08:06   #4
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
1. не общий механизм - завтра другой класс ( не говорю об иерархии) - писать снова - не хочется.
2. я не хочу только количество базовых, но так же и наследуемых классов.
тогда так:
Code:
template<class T>
class InstanceCounter
{
public:
   InstanceCounter() { counter_++; }
   static int counter_;
};

template<class T>
InstanceCounter::counter_ = 0;

class A:
 InstanceCounter<A>
{};

class B:
 class A,
 class InstanceCounter<B>
{};
Reply With Quote
Old 03.05.2004, 09:15   #5
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Quote:
Originally Posted by Aram Hambardzumyan
тогда так:
Code:
template<class T>
class InstanceCounter
{
public:
   InstanceCounter() { counter_++; }
   static int counter_;
};

template<class T>
InstanceCounter::counter_ = 0;

class A:
 InstanceCounter<A>
{};

class B:
 class A,
 class InstanceCounter<B>
{};
Глобально говоря - да. Но работать не будет. Сам найдешь ошибку или мне показать?
Я бы счетчик сделал приватным. И предоставил сататическую функцию - член.
Reply With Quote
Old 03.05.2004, 10:51   #6
....
 
JennyWren's Avatar
 
Join Date: 04 2004
Location: Across the Universe
Age: 34
Posts: 2,497
Downloads: 1
Uploads: 0
Reputation: 53 | 3
Default

S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno
Reply With Quote
Old 03.05.2004, 12:41   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Quote:
Originally Posted by programmer1
S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno
Уважаемый, решение в студию, раз. Во вторых - это опять нарушает мое требование - общность механизма.
И опять же в каждом класс по счетчику - не хочется столько писать.
Reply With Quote
Old 09.05.2004, 08:29   #8
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Глобально говоря - да. Но работать не будет. Сам найдешь ошибку или мне показать?
Я бы счетчик сделал приватным. И предоставил сататическую функцию - член.
ну насчет счетчика - моей целью было только предоставить принципиальное решение, потому на детали на обращал внимания.

попытка номер 2:
Code:
// InstCounter оставляем прежним;

template<class T>
struct Dec
{
  Dec() { --InstCounter<T>::counter_; }
};

// how to use:

class A: InstCounter<A> { ... };
class B: A, InstCounter<B>, Dec<A> { ... };
class C: B, InstCounter<C>, Dec<B> { ... };

// virtual inheritance:
class VB: InstCounter<VB> { ... };
class VD1: virtual VB, InstCounter<VD1>, virtual Dec<VB> { ... };
class VD2: virtual VB, InstCounter<VD2>, virtual Dec<VB> { ... };
class D: VD1, VD2, InstCounter<D>, Dec<VD1>, Dec<VD2> { ... };
вроде так. правдя, все равно получается громоздко, но это все же лучше чем каждый раз вручную прибавлять счетчик для класса с несколькими конструкторами.
и наконец, чтобы все работало корректно, нужно также позаботиться о счетчиках в деструкторах: в ~InstCounter() он должен уменьшаться на единицу, а в ~Dec() - увеличиваться
Reply With Quote
Old 09.05.2004, 08:58   #9
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
Reply With Quote
Old 09.05.2004, 09:34   #10
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка
ну это так, мелочь, настоящая ошибка была в том, что унаследованный объект увеличивал количество базовых.
Quote:
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
если конструктор убавляет, то деструктор должен прибавлять. прогони на примерах при выходе из области видимости - работает как раз с таким деструктором.
Reply With Quote
Old 09.05.2004, 12:26   #11
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Насчет пшрибавления базовых - это не однозначно. Так как базовый объект "создается" - так что применение струтуры dec нужно или не нужно в зависимости от задачи.
Насчет инкремента понял. Так как уничтожается базовый подобъект, то будет декремент в счетчике, надо восстановить. Согласен
Reply With Quote
Old 20.08.2004, 11:58   #12
Дошкольник
 
Join Date: 08 2004
Location: Oxford
Age: 38
Posts: 141
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

По моему нужен отдельный объект со статической-переменной счётчиком, (или просто переменная, если в C/C++) которая будет потом меняться из конструкторов и деструкторов всех классов иерархии. Проблем с наследованием статика тогда не будет. Интересно, а можно ли то же самое сделать в Java? По моему, гораздо сложнее, ведь в Java нет деструкторов. Можно ли как нибудь “поймать” момент garbage collection?
Reply With Quote
Old 20.08.2004, 12:14   #13
Дошкольник
 
Join Date: 08 2004
Location: Oxford
Age: 38
Posts: 141
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Решение не блещущее элегантностью, но надежное:

PHP Code:
import java.util.Vector;

public class 
Count {
    
    public static 
Vector counter = new Vector();

    public 
Count() {
    }
    
    public static 
void main(String[] args) {
        
A a = new A();
        
B b = new B();
        
System.out.print(getCount());
    }

    public static 
int getCount(){return counter.size();}
}

class 
{
    public 
A(){
        
Count.counter.add(this);
    }
}
    
class 
extends A{
    public 
B(){
        
super();
    }

Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 20:20.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.