AKB Forums

Go Back   AKB Forums > Technical sections > Languages, Compilers and Interpreters
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

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old May 3, 2004, 05:26   #1
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Задача сложнее:

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

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

Жду решений.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old May 3, 2004, 06:33   #2
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7
Reputation: 45
а почему статический счетчик в базовом классе не подходит?
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old May 3, 2004, 06:47   #3
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
1. не общий механизм - завтра другой класс ( не говорю об иерархии) - писать снова - не хочется.
2. я не хочу только количество базовых, но так же и наследуемых классов.
Пример из жизни
PHP Code:
class Instance {};
class 
GateInstance : public Instance {};
class 
ModuleInstance : public Instance{}; 
теперь мне хочется знать не только сколько существует инстантированных сущностей, а конкретно сколько логических элементов и сколько модулей.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old May 3, 2004, 07:06   #4
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7
Reputation: 45
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>
{};
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old May 3, 2004, 08:15   #5
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
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>
{};
Глобально говоря - да. Но работать не будет. Сам найдешь ошибку или мне показать?
Я бы счетчик сделал приватным. И предоставил сататическую функцию - член.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old May 3, 2004, 09:51   #6
....
 
JennyWren's Avatar
 
Join Date: Apr 2004
Location: Across the Universe
Posts: 2,497
Rep Power: 5
Reputation: 63
Send a message via ICQ to JennyWren Send a message via Skype™ to JennyWren
S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno
JennyWren is offline   Reply With Quote Quote selected
Old May 3, 2004, 11:41   #7
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Quote:
Originally Posted by programmer1
S pomoshyu staticheskoy funkcii ili chlena sdelat' eto ne trudno
Уважаемый, решение в студию, раз. Во вторых - это опять нарушает мое требование - общность механизма.
И опять же в каждом класс по счетчику - не хочется столько писать.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old May 9, 2004, 07:29   #8
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7
Reputation: 45
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() - увеличиваться
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old May 9, 2004, 07:58   #9
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old May 9, 2004, 08:34   #10
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,180
Rep Power: 7
Reputation: 45
Quote:
Originally Posted by Agregat
Я именно деструктор и имел в виду, когда говорил, что у тебя ошибка
ну это так, мелочь, настоящая ошибка была в том, что унаследованный объект увеличивал количество базовых.
Quote:
Деструктор dec -а ничего делать не должен. Прибавлять в деструкторе по меньшей мере бесмысленно.
если конструктор убавляет, то деструктор должен прибавлять. прогони на примерах при выходе из области видимости - работает как раз с таким деструктором.
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old May 9, 2004, 11:26   #11
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,614
Rep Power: 11
Reputation: 202
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Насчет пшрибавления базовых - это не однозначно. Так как базовый объект "создается" - так что применение струтуры dec нужно или не нужно в зависимости от задачи.
Насчет инкремента понял. Так как уничтожается базовый подобъект, то будет декремент в счетчике, надо восстановить. Согласен
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Aug 20, 2004, 10:58   #12
Дошкольник
 
Join Date: Aug 2004
Location: Oxford
Posts: 141
Rep Power: 5
Reputation: 10
По моему нужен отдельный объект со статической-переменной счётчиком, (или просто переменная, если в C/C++) которая будет потом меняться из конструкторов и деструкторов всех классов иерархии. Проблем с наследованием статика тогда не будет. Интересно, а можно ли то же самое сделать в Java? По моему, гораздо сложнее, ведь в Java нет деструкторов. Можно ли как нибудь “поймать” момент garbage collection?
Ablertus is offline   Reply With Quote Quote selected
Old Aug 20, 2004, 11:14   #13
Дошкольник
 
Join Date: Aug 2004
Location: Oxford
Posts: 141
Rep Power: 5
Reputation: 10
Решение не блещущее элегантностью, но надежное:

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();
    }

Ablertus is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


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


All times are GMT. The time now is 08:39.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link