C++基类中使用静态数组,在派生类中声明
C++ using static array in base class, declaring in derived class
我正在尝试创建一些类,这些类都是从抽象类(我们称之为)BaseClass派生的类。在 BaseClass 中,我想对派生类中声明的静态变量(数组)进行操作。C++有没有一种聪明的方法可以让编译器知道静态变量将在 derivered 类中声明?或者,例如,我应该在我的派生类的构造函数中将对静态变量的引用传递给基类构造?这是我的想法:
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){};
...
}
我的解决方案正确吗?有没有更好的方法可以做到这一点?
您可以使用 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() {};
};
在 BaseClass 中,我想对派生类中声明的静态变量(数组)进行操作。
虚拟实例成员函数可以将工作委托给派生类的重写,该类可以为您执行访问。在静态上下文中没有办法做到这一点(不过,看起来你并没有试图这样做)。
例如,我是否应该在派生类的构造函数中将对静态变量的引用传递给基类构造函数?
这也可以是一个解决方案。但是,派生类的所有实例都将访问相同的静态数据区域,并且需要存储对它的引用。
基于虚函数的解决方案不需要额外的存储来引用向量:
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; }
...
};
相关文章:
- 具有多个类、派生类的C++正向声明
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 将派生类的构造函数声明为父类的友元
- 从模板基类派生是否在派生类声明的点实例化模板
- 从基类的唯一指针中声明派生类的类型
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 如何声明从 QApplication 派生的 Qt 类并覆盖通知函数?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 冲突的声明(外部基础与派生)
- 声明派生类的对象而不指定它
- 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明
- 声明嵌套基模板类实例是派生类的好友
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- 在基类主体内声明但通过派生类召集的函数
- 如何在基本模板类中声明成员,其中类型取决于派生类的类型
- 在派生的C 类中,访问基类受保护成员作为公共的访问声明
- 在基类中使用派生类,而在基类之后声明派生类
- 在派生类或基类中,我应该在哪里声明友元类