 |
Задача сложнее: |
 |
03.05.2004, 05:26
|
#1
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Задача сложнее:
Господа, позволю себе предложить вам задачу не такую простую.
Требуется написать механизм, который будет подсчитывать количество экземпляров данного класса. Механизм, само собой, должен быть как можно более универсальным.
В задаче есть нюанс следующего рода:
PHP Code:
class A {};
class B : public A {};
int main()
{
A a;
B b;
}
Сколько объектов А тут будет 1 или 2? Я считаю, что должно быть 2 объекта, но если у вас иное мнение на этот счет то прошу.
Жду решений.
|
|
|
03.05.2004, 06:33
|
#2
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
а почему статический счетчик в базовом классе не подходит?
|
|
|
03.05.2004, 06:47
|
#3
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
1. не общий механизм - завтра другой класс ( не говорю об иерархии) - писать снова - не хочется.
2. я не хочу только количество базовых, но так же и наследуемых классов.
Пример из жизни
PHP Code:
class Instance {};
class GateInstance : public Instance {};
class ModuleInstance : public Instance{};
теперь мне хочется знать не только сколько существует инстантированных сущностей, а конкретно сколько логических элементов и сколько модулей.
|
|
|
03.05.2004, 07:06
|
#4
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
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>
{};
|
|
|
03.05.2004, 08:15
|
#5
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
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>
{};
|
Глобально говоря - да. Но работать не будет. Сам найдешь ошибку или мне показать? 
Я бы счетчик сделал приватным. И предоставил сататическую функцию - член.
|
|
|
03.05.2004, 09:51
|
#6
|
....
Join Date: 04 2004
Location: Across the Universe
Age: 41
Posts: 2,497
Rep Power: 5
|
S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno
|
|
|
03.05.2004, 11:41
|
#7
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Quote:
Originally Posted by programmer1
S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno 
|
Уважаемый, решение в студию, раз. Во вторых - это опять нарушает мое требование - общность механизма.
И опять же в каждом класс по счетчику - не хочется столько писать.
|
|
|
 |
|
 |
09.05.2004, 07:29
|
#8
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
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() - увеличиваться
|
|
|
 |
09.05.2004, 07:58
|
#9
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка 
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
|
|
|
09.05.2004, 08:34
|
#10
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by Agregat
Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка 
|
ну это так, мелочь, настоящая ошибка была в том, что унаследованный объект увеличивал количество базовых.
Quote:
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
|
если конструктор убавляет, то деструктор должен прибавлять. прогони на примерах при выходе из области видимости - работает как раз с таким деструктором.
|
|
|
09.05.2004, 11:26
|
#11
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Насчет пшрибавления базовых - это не однозначно. Так как базовый объект "создается" - так что применение струтуры dec нужно или не нужно в зависимости от задачи.
Насчет инкремента понял. Так как уничтожается базовый подобъект, то будет декремент в счетчике, надо восстановить. Согласен
|
|
|
20.08.2004, 10:58
|
#12
|
Дошкольник
Join Date: 08 2004
Location: Oxford
Age: 46
Posts: 141
Rep Power: 0
|
По моему нужен отдельный объект со статической-переменной счётчиком, (или просто переменная, если в C/C++) которая будет потом меняться из конструкторов и деструкторов всех классов иерархии. Проблем с наследованием статика тогда не будет. Интересно, а можно ли то же самое сделать в Java? По моему, гораздо сложнее, ведь в Java нет деструкторов. Можно ли как нибудь “поймать” момент garbage collection?
|
|
|
20.08.2004, 11:14
|
#13
|
Дошкольник
Join Date: 08 2004
Location: Oxford
Age: 46
Posts: 141
Rep Power: 0
|
Решение не блещущее элегантностью, но надежное:
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 A {
public A(){
Count.counter.add(this);
}
}
class B extends A{
public B(){
super();
}
}
|
|
|
All times are GMT. The time now is 09:35. |
|
|