我试图创建一些类,这些类都是抽象类的派生类(让我们称之为) BaseClass 。在BaseClass中,我想对派生类中声明的静态变量(数组)进行操作。在C ++中是否有一种聪明的方法让编译器知道静态变量将在派生类中声明?或者,例如,我应该在我的派生类中使用'构造函数将对静态变量的引用传递给基类构造?这是我的想法:
class BaseClass
{
std::vector<float> &vector;
public:
BaseClass(std::vector<float> &dVector):vector(dVector){};
void vectorOperation()
{
vector.doSomething();
}
...
}
class DerivedClass : public BaseClass
{
static std::vector<float> sVector;
DerivedClass():BaseClass(sVector){};
...
}
我的解决方案是否正确?有没有更好的方法来做到这一点?
答案 0 :(得分:3)
您可以使用CRTP模式,但我不相信它比您拥有的更好。
template <typename Derived>
class BaseClass
{
std::vector<float> &vector;
public:
BaseClass(): vector(Derived::getVector()){};
};
class DerivedClass : public BaseClass<DerivedClass>
{
public:
static std::vector<float>& getVector()
{
static std::vector<float> v;
return v;
}
DerivedClass() {};
};
答案 1 :(得分:2)
在BaseClass中,我想对派生类中声明的静态变量(数组)进行操作。
虚拟实例成员函数可以将工作委派给派生类的覆盖,派生类可以为您进行访问。在静态上下文中无法做到这一点(虽然看起来不像你试图这样做)。
例如,我应该在我的派生类中使用&#39;构造函数将对静态变量的引用传递给基类构造函数吗?
这也是一个解决方案。但是,派生类的所有实例都将访问相同的静态数据区域,并且需要存储对它的引用。
基于虚函数的解决方案不需要额外的存储空间来引用向量:
class BaseClass
{
protected:
virtual std::vector<float>& vector() = 0;
public:
void vectorOperation()
{
vector().doSomething();
}
...
};
class DerivedClass : public BaseClass
{
static std::vector<float> sVector;
protected:
std::vector<float>& vector() { return sVector; }
...
};