![]() | |
| |||||||
| Home | Register | Blogs | FAQ | Members List | Calendar | Downloads | Arcade | Mark Forums Read |
| Languages, Compilers and Interpreters C,C++,C#,.NET,Java,PHP,Perl,SQL and more |
![]() |
| | LinkBack | Thread Tools | Display Modes |
| | #1 |
| Грустно... | Задача сложнее: Господа, позволю себе предложить вам задачу не такую простую. Требуется написать механизм, который будет подсчитывать количество экземпляров данного класса. Механизм, само собой, должен быть как можно более универсальным. В задаче есть нюанс следующего рода: PHP Code: Жду решений.
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! |
| | |
| | #2 |
| The Reloaded Join Date: Jan 2002 Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7 Reputation:
45 | а почему статический счетчик в базовом классе не подходит?
__________________ Сайт армянских маньяков |
| | |
| | #3 |
| Грустно... | 1. не общий механизм - завтра другой класс ( не говорю об иерархии) - писать снова - не хочется. 2. я не хочу только количество базовых, но так же и наследуемых классов. Пример из жизни PHP Code:
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! |
| | |
| | #4 | |
| The Reloaded Join Date: Jan 2002 Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7 Reputation:
45 | Quote:
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>
{};
__________________ Сайт армянских маньяков | |
| | |
| | #5 | |
| Грустно... | Quote:
![]() Я бы счетчик сделал приватным. И предоставил сататическую функцию - член.
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! | |
| | |
| | #7 | |
| Грустно... | Quote:
И опять же в каждом класс по счетчику - не хочется столько писать.
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! | |
| | |
| | #8 | |
| The Reloaded Join Date: Jan 2002 Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7 Reputation:
45 | Quote:
попытка номер 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() - увеличиваться
__________________ Сайт армянских маньяков | |
| | |
| | #9 |
| Грустно... | Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка ![]() Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! |
| | |
| | #10 | ||
| The Reloaded Join Date: Jan 2002 Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7 Reputation:
45 | Quote:
Quote:
__________________ Сайт армянских маньяков | ||
| | |
| | #11 |
| Грустно... | Насчет пшрибавления базовых - это не однозначно. Так как базовый объект "создается" - так что применение струтуры dec нужно или не нужно в зависимости от задачи. Насчет инкремента понял. Так как уничтожается базовый подобъект, то будет декремент в счетчике, надо восстановить. Согласен ![]()
__________________ http://аvitya.livejournal.com Хотели, как лучше, а получилось даже хуже... Лозунг шахматиста: На каждый шах - ответим матом! |
| | |
| | #12 |
| Дошкольник Join Date: Aug 2004 Location: Oxford
Posts: 141
Rep Power: 5 Reputation:
10 | По моему нужен отдельный объект со статической-переменной счётчиком, (или просто переменная, если в C/C++) которая будет потом меняться из конструкторов и деструкторов всех классов иерархии. Проблем с наследованием статика тогда не будет. Интересно, а можно ли то же самое сделать в Java? По моему, гораздо сложнее, ведь в Java нет деструкторов. Можно ли как нибудь “поймать” момент garbage collection? |
| | |
| | #13 |
| Дошкольник Join Date: Aug 2004 Location: Oxford
Posts: 141
Rep Power: 5 Reputation:
10 | Решение не блещущее элегантностью, но надежное: PHP Code: |
| | |
![]() |
| Thread Tools | |
| Display Modes | |
| |
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| И еще задача | Agregat | Languages, Compilers and Interpreters | 39 | Aug 20, 2004 10:14 |
| Нетривиальная задача | Boyov | Algorithms | 22 | Nov 12, 2003 17:40 |
| Задача. | Gates | Fun | 0 | Oct 24, 2002 19:22 |
| Tрудная Задача / Длинная арифметика | Rainman | Algorithms | 8 | Oct 4, 2002 13:53 |
| Задача Эйнштейна | Gates | General | 1 | Aug 7, 2002 06:19 |