我设计了一系列相关的类,为了能够管理它们,我让它们派生自一个抽象类。
这些类都需要访问一系列共享资源,我发现自己在每个类中创建了一个指针 vector ,所有这些都相同(它们必须相同)。似乎在基类中创建一个静态成员会让所有派生类都可以访问这个 vector ,这意味着我只需要构建它一次(它在构建之后也不会改变,只是查找)。
我的问题是这是否可以,如果可以,我该如何构建它,而不从其中一个派生类调用“填充 vector ”方法?
我的想法是做类似的事情
class Resource {};
enumR {RES0, RES1};
class AbstractClass
{
public:
virtual void OnInit() = 0;
void static fillVector(Resource* pResource, enumR Resourcename)
{lResource[Resourcename]=pResource;};
protected:
static vector<Resource*> lResource;
};
vector<Resource*> AbstractClass::lResource;
int main()
{
Resource res0, res1;
AbstractClass::fillVector(&res0, RES0);
AbstractClass::fillVector(&res1, RES1);
return 0;
};
然后,当我实例化从 AbstractClass 派生的任何类的对象时,我可以访问 lResource vector ,这正是我想要的。
这行得通吗?可怕吗?可以吗?
最佳答案
它会工作,其中工作 = 编译和运行。
但是,所有子类都将访问相同的静态 vector ,这意味着每个子类不会有不同的静态 vector 拷贝。
为了更好地解释我的意思,请阅读以下 So 线程:
解决方案:
一个解决方案是让您的父类成为一个模板类,如下所示:
template<T>
class Parent<T> {
public:
static std::vector<T> sharedResource_;
}
class ChildA : Parent<ChildA> {
}
class ChildB : Parent<ChildB> {
}
在上面的代码中,您将获得 ChildA 的所有实例 的共享资源和 ChildB 的实例 之间共享的另一个资源。
对吗?
嗯,我觉得算不上好。与此相关的讨论之一是对以下 SO 问题的评论以及我对问题的回答:
关于c++ - 我可以在抽象类中有静态数据成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387029/