有没有一种方法可以声明一个成员,使其在所有派生类中都是静态的



我有几个抽象类,它们需要管理包含指向它们自己的每个实例的指针的静态向量。以下是其中一个类的简化示例:

class AbstractBase1
{
public:
AbstractBase1()
{
allInstances_.push_back(this);
}
AbstractBase1(const AbstractBase1& source)
: AbstractBase1()
{
//Copy data from source
}
AbstractBase1(const AbstractBase1&& source)
: AbstractBase1()
{
//Copy data from source
}
virtual ~AbstractBase1()
{
//Find the index of 'this' with std::find and remove it from allInstances_
}
virtual void purelyVirtualMethod() = 0;
static void doSomethingWithAllInstances()
{
for (AbstractBase1* ptr : allInstances_)
{
ptr->purelyVirtualMethod();
}
}
private:
static std::vector<AbstractBase1*> allInstances_;
//Some data that will be inherited
};

因此,我不必为每个需要此功能的类编写所有代码,而是想创建一个包含此功能的InstanceTracker类,然后让所有这些类从中继承。但我无法理解这个InstanceTracker类的外观,因为我不希望这个类管理其所有派生类实例的静态向量。我想要的是,从InstanceTracker继承的每个类都将获得自己的静态向量,该向量将管理其实例。

有没有办法实现这一点,或者我只需要为每个需要的类编写实例跟踪代码?

您可以使用模板:

template <typename Tag>
class AbstractBaseT
{
public:
AbstractBaseT() { allInstances_.push_back(this); }
AbstractBaseT(const AbstractBase1& source) : AbstractBaseT()
{
//Copy data from source
}
AbstractBaseT(AbstractBaseT&& source) : AbstractBase1()
{
//Move data from source
}
virtual ~AbstractBaseT()
{
//Find the index of 'this' with std::find and remove it from allInstances_
}
virtual void purelyVirtualMethod() = 0;
static void doSomethingWithAllInstances()
{
for (AbstractBase1* ptr : allInstances_)
{
ptr->purelyVirtualMethod();
}
}
private:
static std::vector<AbstractBaseT*> allInstances_;
//Some data that will be inherited
};

然后

using AbstractBase1 = AbstractBaseT<struct tag1>;

或者CRTP方式也可能有用:

struct AbstractBase2 : AbstractBaseT<AbstractBase2>
{
// ...
};

最新更新