抽象类中可以有静态数据成员吗?

2024-04-18

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

这些类都需要访问一系列共享资源,我发现自己在每个类中创建了一个指针向量,它们全部相同(它们必然必须相同)。似乎在基类中创建一个静态成员将使所有派生类都可以访问该向量,这意味着我只需要构建它一次(它在构建后也不会改变,只需查找)。

我的问题是这是否可以,如果可以,我如何构建它,而不从派生类之一调用“填充向量”方法?

我的想法是做类似的事情

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 向量,这就是我想要的。

这行得通吗?可怕吗?可以吗?


它会起作用,其中工作=编译和运行。

但是,所有子类都将访问相同的静态向量,这意味着每个子类不会有不同的静态向量副本。

为了更好地解释我的意思,请阅读以下主题:

静态字段可以继承吗? https://stackoverflow.com/questions/998247/are-static-members-inherited-c

解决方案:

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

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

class ChildA : Parent<ChildA> {
}

class ChildB : Parent<ChildB> {
}

在上面的代码中,您将获得所有人的共享资源实例ChildA 和另一个共享的实例儿童 B.

这样对吗?

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

如何在 C# 中实现“静态重载 const”? https://stackoverflow.com/q/6212723/365188

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象类中可以有静态数据成员吗? 的相关文章

随机推荐

  • MySql 将值从一行复制到另一行

    这应该是非常基本的 但我无法弄清楚 有一个表 值 entity attribute value frank shirt red frank hat green sam shirt blue sam hat orange 我如何将同一个人的所
  • .Net Framework dll 不适用于 .Net Standard 项目

    我已经参考了 Net框架 ddl to Net标准2 0 它会向我显示以下错误 System Reflection ReflectionTypeLoadException Unable to load one or more of the
  • 复选框值始终为“打开”[重复]

    这个问题在这里已经有答案了 这是我的复选框 HTML
  • C# - 转换日期时间格式 yyyy-MM-dd [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试将日期时间格式从 dd M
  • nock 库 - 如何匹配任何 url

    嗨 我正在尝试箭库 https github com flatiron nock blob master README md但正在努力匹配查询字符串上的随机模式 我认为类似下面的代码应该可以工作 但我无法让任何东西工作 var nock r
  • 在pandas中读取csv时自动确定标题行

    我正在尝试从共享相同列名称的不同 csv 文件收集数据 但是 某些 csv 文件的标题位于不同的行中 有没有办法根据包含 大多数 值 实际标题名称 的第一行动态确定标题行 我尝试了以下方法 def process file file pat
  • 没有单位的行高的缺点?

    在没有单位的情况下指定行高是否有任何缺点 浏览器 设备不一致 Example body line height 1 5 在大多数情况下 使用无单位行高实际上更好 请参阅 http meyerweb com eric thoughts 200
  • JSHint 和 eclipse 插件

    所以我刚刚在 Eclipse Kepler 中安装了 JSHint 我加载了 jshintrc 文件 如何在我的 javascript 文件上运行 jshint 我没有看到菜单项 也没有看到指定文件名等的地方 有人可以帮忙吗 添加后 jsh
  • 任意预设精度小数(几乎像 BigDecimal)

    我正在寻找一个 java 类 它将保存具有任意预设精度的十进制值 班上BigDecimal看起来是一个很好的起点 但我希望能够将小数的大小限制为最终用户决定的大小 从字面上讲 最终用户将指定一个以 10 为基数的范围 我将分配足够的字节来表
  • 如何使用 open() 函数清除 .txt 文件?

    我有一个简单的程序 可以打开文件并替换文本 但是 我希望程序清除文件 然后保存需要保存的内容 我怎么做 或者有更简单的方法吗 如果您使用模式打开文件w如果文件已经存在 它将覆盖该文件 with open your file w as f f
  • 加载内核模块时出现未知符号

    我需要帮助理解为什么在插入模块时出现错误 我努力了this http www linuxforums org forum kernel 56497 unkown symbol module error while insmodding bu
  • spring jar bootRun 导致 GraphQL Schema 错误

    当我使用 gradle 构建 Spring Boot 应用程序时bootRun or build然后运行输出 jar 我从控制台日志中得到以下大量错误列表 2018 03 18 00 49 38 754 ERROR 228 main o s
  • Qt 自定义外观和感觉?

    我可以强制我的 Qt 应用程序使用不同的外观和感觉 就像在 KDE 中一样吗 您始终可以使用 QApplication setStyle 更改小部件的样式 Qt4 中有一些预定义的选项可用 在 main cpp 中做这样的事情 includ
  • 如何使用 ggplot2 面颜色和形状?

    也许 我错过了 ggplot 语法中的一些内容 可以毫无错误地绘制以下 3 个方面 不幸的是 面图混合了颜色和形状 右侧一栏应仅显示蓝色标记 而中间一栏应显示绿色标记 data1 num delay claim supply project
  • 错误:输入文件并非全部位于同一目录中,请提供显式 wd

    在尝试构建一个大约两周前工作的 PDF 后 没有大惊小怪 在一台全新安装了 R R studio 的新机器上 bookdown等等 我有这个错误 Error Input files not all in same directory ple
  • Laravel 迁移更改列的默认值

    我有一个已分配默认值的表 例如 我们可以看看以下内容 Schema create users function Blueprint table table gt increments id gt unsigned table gt inte
  • 子元素悬停时的 CSS 过渡

    当子元素的父元素悬停在其上方时 我试图暂停子元素的显示 Html span div This Is The Child div Some Text in the span span Css span position relative sp
  • 如何在 php 脚本仍在运行时显示结果

    所以我尝试过在脚本仍在执行时显示结果 https stackoverflow com questions 5415665 show results while script is still executing 但由于某种原因它不起作用 所
  • Jshell错误:java.lang.NullPointerException:charsetName

    我正在尝试使用 JDK11 提供的 JShell 来运行一些简单的命令 但是当我输入 jshell gt System out println Hello World 它给了我错误 Exception in thread main java
  • 抽象类中可以有静态数据成员吗?

    我设计了一系列相关的类 为了能够管理它们 我让它们从一个抽象类派生 这些类都需要访问一系列共享资源 我发现自己在每个类中创建了一个指针向量 它们全部相同 它们必然必须相同 似乎在基类中创建一个静态成员将使所有派生类都可以访问该向量 这意味着