计算每个派生类的类实例

2024-03-01

有没有办法让所有派生类计算它们的实例?如何(用 C++、C#、Java 之一编写代码)?

想象一下,我可以访问根类(例如对象),并且每个其他类都是(直接或间接)从该类派生的。我想要的是:

AnyDerivedClass.InstancesCount()

问题是,必须跟踪静态变量中的计数,但不可能将静态变量从基类“注入”到派生类中,这仅适用于成员变量。 也就是说,我必须写这样的东西:

class object 
{ 
 private static int count = 0; 
 protected object() { ++count; }
 protected ~object() { --count; } 
 public static InstancesCount() { return count; } 
};

class derived : object 
{
 private static int count = 0;
 public derived() { ++count; }
 public ~derived() { --count; }
 public static InstancesCount() { return count; }
}

这个功能显然是重复的,我不能把它放在基类中。 请注意,有 2 种计算方法:如果有 7 个类导出 1 的实例和 8 个类导出 2 的实例,则有 (a) 15 个对象实例或 (b) 0 个对象实例。我不在乎是哪一个,因为我两者都不能做(使用相当实用的方法,例如想象 100 个类,其中一半在我无法修改的库中)。

当然,理论上可以创建(某些运行类型类型标识符)=> int count 的映射,并使用丑陋、缓慢、基于(运行时类型)的方法(至少在 C#、Java 中)。

当然,如果我可以修改派生类,我可以使用复制粘贴(糟糕)、宏(是的,我知道)、mixins(不在这些语言中)等。但这仍然很丑陋。

这是特定的问题,但它发生在我身上好几次,我希望能够将静态成员“注入”到派生类中以优雅地解决问题。

非常感谢帮助。

编辑:感谢您的良好回答,在 C++ 中也可以使用 CRTP(奇怪的重复模板模式),但不能在 C#/Java 中使用(没有多重继承)。当然,必须有权访问派生类并添加此基类,因此问题仍然存在(如果没有其他方法,这看起来是最好的)。

编辑2:对于当前的语言来说看起来不可能。每个类的静态部分都不是继承的(这是正确的),但是没有与每个类关联的继承单例,因此此类问题无法如此优雅地解决。 为了说明问题,请查看以下代码:普通成员和静态成员是当前 OOP 语言功能,“单例”(或任何单词)成员是我的建议/愿望:

class Base
{
    static int sMemberBase;
    int memberBase;

    //my wish (note that virtual for methods is allowed!):
    singleton int singletonMemberBase;
};
class Derived : Base
{
    static int sMemberDerived;
    int memberDerived;

    //my wish (note that virtual for methods is allowed!):
    singleton int singletonMemberDerived;
};

//taken apart: (note: XYZStatic classes do not derive)
class Base { int memberBase; }
class BaseStatic { int sMemberBase; } BaseStaticInstance;
class Derived : Base { int memberDerived; }
class DerivedStatic { int sMemberDerived;  } BaseStaticInstance;
//note: Derived::sMemberBase is compile-time changed to Base::sMemberBase

//my wish: (note inheritance!)
class BaseSingleton { int singletonMemberBase; } BaseSingletonInstance;
class DerivedSingleton : BaseSingleton { int singletonMemberDerived; } DerivedSingletonInstance;

如果语言中存在类似的东西,我的问题的解决方案将是简单而优雅的:

//with singleton members, I could write counter like this:
class object
{
    singleton int count;
    object() { ++count; }
    ~object() { --count; }
};

在 C++ 中,您可以使用模板基类来完成此操作。基本上是这样is一个 mixin,因此它仍然需要每个类通过继承 mixin 来进行协作:

// warning: not thread-safe
template <typename T>
class instance_counter {
  public:
    static size_t InstancesCount() { return count(); }
    instance_counter() { count() += 1; }
    instance_counter(const instance_counter&) { count() += 1; }
    // rare case where we don't need to implement the copy assignment operator.
  protected:
    ~instance_counter() { count() -= 1; }
  private:
    static size_t &count {
        static size_t counter = 0;
        return counter;
    }
};

class my_class: public instance_counter<my_class> {};

由于使用模板的每个类都有一个不同的基类,它有一个不同的 count函数,因此静态变量的不同副本counter.

从使用派生类作为模板参数实例化的模板类继承的技巧称为 CRTP。

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

计算每个派生类的类实例 的相关文章

  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 求两个向量之间的差异

    我有两个向量 a lt 1 100 b lt sample 1 100 80 我想显示 a 中未包含在 b 中的那些元素 我努力了subset a a b and a a b 但这些都不起作用 我究竟做错了什么 由于 R 中的矢量化 使用
  • Ubuntu 10服务器上配置Tomcat6 + apache2.2的问题

    我正在尝试在 Ubuntu 服务器 10 上使用 apache 2 2 配置 Tomcat6 我遵循了很多教程 但我无法使其工作 请问有人可以帮助我吗 这是一些信息 mod jk so 位于 apache 模块文件夹中 我的工人属性 wor
  • IGraphBuilder.RenderFile 中无法播放 MP3 文件并出现 COM 异常

    我是导演节目开发的新手 我正在学习有关直接表演的知识 我正在尝试编写一种播放一些音频文件的方法 它适用于许多 mp3 文件 但对于我的某些 mp3 文件 接口 IGraphBuilder 的方法 RenderFile 抛出以下异常 发生 C
  • 检测滑动手势方向

    这是我尝试模拟滑动手势的代码 因此当我构建移动设备时 我知道它会起作用 没有记录任何内容 我很困惑为什么它似乎不起作用 我希望它在我滑动的控制台中打印出来RTL 从右到左 或LTR 左到右 我不明白我做错了什么 void Update if
  • 如何在 Sails.js 中压缩 JavaScript 和 CSS 资源?

    我正在尝试在 Sails js Node 应用程序中为我的资产启用 gzip 压缩 在生产环境中启动应用程序时 所有资产assets linker js and assets linker styles已成功连接 缩小 丑化 如 Grunt
  • 如何从 CLI 构建 DocC 文档

    所以我已经浏览网页有一段时间了 似乎找不到有关如何构建的答案本机 DocC Xcode 文档 使用 CLI 命令 这俩xcodebuild据我所知 commands 和 Fastlane 不提供构建文档的命令 应该构建文档CI CD Git
  • IllegalArgumentException:ID 未引用此 Activity 内的视图

    我一直在尝试为我的应用程序制作一个主页 其中包含一些现代仪表板和导航抽屉 在我的代码中发现错误 E AndroidRuntime FATAL EXCEPTION main Process com example thinkerlab PID
  • 在 MacOS 上使用 cx_freeze 打包 tkinter GUI 会导致黑色 GUI

    我正在构建一个tkinter一位朋友在运行 macOS Catalina 10 15 2 的 Mac 上使用 Python 3 8 3 的 GUI 并尝试使用冻结它cx freeze 6 1 当我在本地环境中运行 python 应用程序时
  • utf8数据在mysql中看起来很好,但在rails中被破坏了

    我正在为我的一位同事设置一个 Rails 环境 他使用的是 Mac 如果相关的话 我已经从我们的实时 mysql 数据库中提取了数据 并使用该数据创建了一个本地开发数据库 如果我打开 mysql 控制台 并查看其名称字段中具有扩展字符集字符
  • IntelliJ 中的 CLI-Spring Shell

    我正在 IntelliJ 中编写 CLI Spring shell 代码 我运行它并给出一些参数 但是当我输入 insert 并按 Enter 时 控制台不接受它 看起来好像什么也没发生 My code Component public c
  • 如何强制iFrame打开所有链接保留在iFrame中?

    我正在托管一个 iFrame 似乎当链接指向外部域时 它会将其加载到主窗口而不是 iFrame 中 有没有办法强制在同一个 iFrame 中打开链接 注意 我可以向 iFrame 中加载的页面添加任何我想要的内容 使用 Chrome 扩展
  • .NET MVC 3 自定义控制器属性

    这可能是天上掉馅饼 但我想知道是否可以使用自定义控制器属性来完成以下操作 对于大多数控制器 我将向控制器内的每个操作传递一个名为 r 的 URL 参数 r 与我的数据库中的竞赛表中的竞赛 ID 相关联 我希望发生的是 每当调用控制器操作时
  • 增加命中 S3 存储桶端点时允许的最大标头大小

    I am curl 重定向到 S3 存储桶的端点 我必须将一些大标头传递给我的请求 但由于超出了最大标头大小 该请求失败了
  • 使用纯 JavaScript 单击隐藏 Bootstrap 模态框

    我正在研究 Bootstrap Pop Up Modals 我有 2 个名为Button1 Button2 我有 2 个名为Modal1 Modal2 Note Button2是在里面Modal1 Button1在网页上 如果我点击Butt
  • 如何使用 Firebase 将初始数据加载与增量子项分开?

    我有一个应用程序 每 5 秒左右就会有新的子进程添加到 Firebase 中 我有成千上万的孩子 在应用程序加载时 我希望以不同于每 5 秒一次的后续子项的方式处理最初的数千个子项 您可能建议我使用值 处理所有内容 然后使用children
  • 自动装箱与静态数字

    有使用价值吗Integer i NumberUtils INTEGER ONE代替Integer i 1 我不知道自动拳击背后会发生什么 Thanks 基本上它会被编译成 Integer i Integer valueOf NumberUt
  • 将包含 JSON 对象的数据框扩展为更大的数据框

    我有一个带有两列的 pandas 数据框 一个是 ID 另一个是长 JSON 对象 对于数据帧中的每个对象来说都是相同的对象 我的目标是为 JSON 对象中的每个键创建列 这是输入的示例 ID request json 175431467
  • 如何在 5 分钟内使 Django 会话过期?

    我用它来登录用户 def login backend request if request method POST username request POST username password request POST password
  • 如何从表中的列中删除默认值?

    如何更改列以删除默认值 该列是通过以下内容创建的 ALTER table sometable Add somecolumn nchar 1 NOT NULL DEFAULT N 然后修改为 alter table sometable alt
  • 计算每个派生类的类实例

    有没有办法让所有派生类计算它们的实例 如何 用 C C Java 之一编写代码 想象一下 我可以访问根类 例如对象 并且每个其他类都是 直接或间接 从该类派生的 我想要的是 AnyDerivedClass InstancesCount 问题