c++ - 我可以在抽象类中有静态数据成员吗?

标签 c++ abstract-class static-members

我设计了一系列相关的类,为了能够管理它们,我让它们派生自一个抽象类。

这些类都需要访问一系列共享资源,我发现自己在每个类中创建了一个指针 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 线程:

Are static fields inherited?

解决方案:

一个解决方案是让您的父类成为一个模板类,如下所示:

template<T>
class Parent<T> {
    public:
        static std::vector<T> sharedResource_;
}

class ChildA : Parent<ChildA> {
}

class ChildB : Parent<ChildB> {
}

在上面的代码中,您将获得 ChildA 的所有实例 的共享资源和 ChildB 的实例 之间共享的另一个资源。

对吗?

嗯,我觉得算不上好。与此相关的讨论之一是对以下 SO 问题的评论以及我对问题的回答:

How to do "static overloaded const" in C#?

关于c++ - 我可以在抽象类中有静态数据成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6387029/

相关文章:

c++ - 基方法/运算符在派生(C++)上调用时返回基类型?

c++ - 在 C++ 中设计 ABC(抽象基类)的良好实践

c# - 在抽象父类(super class)的子类中强制使用属性

c++ - 静态成员不允许使用不完整的类型

C++静态模板成员初始化问题

c++ - 如何找到函数的多个定义

c++ - 为什么 SFINAE 在这个简单的成员函数重载中不起作用

c++ - 在 C++ 中将字符串 vector 转换为 char 数组

c++ - 私有(private)数据成员类型的静态成员

c++ - 我需要实现自己的 QAbstractTableModel 吗?