вопрос разработки c ++: могу ли я запросить базовые классы, чтобы найти количество производных классов, удовлетворяющих условию - PullRequest
0 голосов
/ 31 мая 2010

У меня есть такой код

class Base
{
public:
Base(bool _active)
{
 active = _active;
}
void Configure();
void Set Active(bool _active);
private: 
bool active;
};
class Derived1 : public Base
{
public:
Derived1(bool active):Base(active){}

};

similarly Derived 2 and Derived 3

Теперь, если я вызываю производный объект1Object.Configure, мне нужно проверить, сколько из производного 1Obj, производного2Obj, производного3Obj активно. Должен ли я добавить это в «базовый» класс, как функция, скажем, GetNumberOfActive ()?

И если реализация такова:

class Imp
{
public:
 void Configure()
 {
  //Code instantiating a particular Derived1/2/3 Object 
  int GetNumberOfActiveDerivedObj();
  baseRef.Configure(int numberOfActiveDerivedClasses);
 }
prive:
Derived1 dObj1(true);
Derived2 dObj2(false);
Derived3 dObj3(true);
};

Должен ли я вычислить количество производных объектов в классе Imp?

Спасибо

Ответы [ 3 ]

3 голосов
/ 31 мая 2010

Одна простая возможность:

NumberOfActive должно быть static в Base. Он должен увеличиваться каждый раз, когда объект создается и становится активным.

2 голосов
/ 31 мая 2010

Вы можете использовать CRTP вместе со статической переменной счетчика: Ссылка на Википедию

редактировать: некоторый код

#include <iostream>

template <typename T> struct counter {
    counter() { ++objects_alive; }
    virtual ~counter() { --objects_alive; }
    static int objects_alive;
};
template <typename T> int counter<T>::objects_alive( 0 );


class Base {
public:
    void Configure();
    //more stuff
};

class Derived1 : public Base, counter<Derived1> {
public:
    void Configure() {
        std::cout << "num Derived1 objects: "<< counter<Derived1>::objects_alive << std::endl;
    }
};

class Derived2 : public Base, counter<Derived2> {
public:
    void Configure() {
        std::cout << "num Derived2 objects: " << counter<Derived2>::objects_alive << std::endl;
    }
};

int main (int argc, char* argv[]) {

    Derived1 d10;
    d10.Configure();
    {
        Derived1 d11;
        d11.Configure();
        Derived2 d20;
        d20.Configure();

    }
    Derived1 d12;
    d12.Configure();
    Derived2 d21;
    d21.Configure();


    return 0;
}

Выход:

$ g++-4 -pedantic crtp1.cpp -o crtp1 && ./crtp1
num Derived1 objects: 1
num Derived1 objects: 2
num Derived2 objects: 1
num Derived1 objects: 2
num Derived2 objects: 1
0 голосов
/ 31 мая 2010

в методе Configure () вы можете получить доступ к фабрике объектов Derived * и получить количество активных объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...