如何减少大量包装类的实现代码?

2024-02-12

我正在开发一个包含一些类的库,我们称它们为C1, C2 and ... Cn。这些类中的每一个都实现一些接口,即I1, I2, ... Im.(n > m)。库中对象之间的关系很复杂,我必须 为我的库用户提供一些 API 以使用智能指针访问这些对象。

经过一番讨论,我发现将共享指针返回给库用户并不是一个好主意,因为在这种情况下,我无法确保可以在我的库内存中精确地删除该对象。返回弱指针也有同样的问题,因为如果 API 的用户.lock()s 弱指针并将结果共享指针保留在某处,我将再次面临同样的问题。

我的最终想法是为弱指针公开某种包装器。包装类可以是这样的:

class Wrapper_C1 : public I1
{
   std::weak_ptr<C1> mC1;
public:
   Wrapper_C1() = delete;
   Wrapper_C1(const std::weak_ptr<C1> & c1) : mC1(c1)
   {
   }

   int method1_C1(int x)
   {
       if (auto sp = mC1.lock())
       {
           sp->method1_C1(x);
       }
       else
       {
            throw std::runtime_error("object C1 is not loaded in the lib.");
       }
   }

   void method2_C1(double y)
   {
       if (auto sp = mC1.lock())
       {
           sp->method2_C1(y);
       }
       else
       {
            throw std::runtime_error("object C1 is not loaded in the lib.");
       }
   }

   // The same for other methods
};

正如您所看到的,所有这些包装类都共享相同的实现。减少所有这些包装类的代码的最佳方法是什么?有没有办法避免重复类似的代码?


如果在包装器中删除继承,您可以执行如下操作来分解所有包装器:

template <typename T>
class Wrapper
{
private:
   std::weak_ptr<T> m;
public:
   Wrapper() = delete;
   Wrapper(const std::weak_ptr<T> & w) : m(w) {}

   auto operator -> () /* const */
   {
       if (auto sp = m.lock())
       {
           return sp;
       }
       else
       {
            throw std::runtime_error("object is not loaded in the lib.");
       }
   }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何减少大量包装类的实现代码? 的相关文章

  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 从数据库填充下拉列表

    我的实体框架中有一个 mvc 3 应用程序 其中有 2 个表 我有另一个名为 Product 的表 其中包含 ProductID 和 ProductName 创建新视图以插入新购买 如何将视图中的 ProductID 文本框更改为由 Pro
  • 导入库仅用于调试

    我在用stetho用于调试我的应用程序的lib Gradle debugCompile com facebook stetho stetho 1 4 1 debugCompile com uphyca stetho realm 2 0 0
  • 添加Java系统模块在Eclipse中编译

    我有一些遗留的 Java 代码 即 package org alo test j9 import javax activation DataHandler in java activation module import javax ann
  • SetWindowSubclass 内的 msftedit.dll RichEdit 控件出现“访问冲突读取位置 0x00000008”错误

    我在单独的子类文件中有编辑控件 在开始工作 SetWindowSubclass 函数后 我是 C 新手 之前我使用 SetWindowLongPtr 进行子类化 它工作得很好 但有人建议我开始使用 SetWindowSubclass 我遇到
  • Grails 渲染插件在部署时不会渲染图像

    我正在使用 grails 渲染插件生成 pdf 在开发过程中 我使用带 src 的标签将图像包含到服务器上的图像中 它工作正常 但部署应用程序后就不再工作了 图像就消失了 我正在通过模板进行渲染 因此当我在 gsp 中调用此模板时 这是可以
  • IQueryable 复杂顺序 $sort 中仅允许使用字段

    我想对列表进行排序 当它是IEnumerable时它工作正常 但是我将其更改为IQueryable来查询MongoDB时 它不起作用 给我这个错误 System NotSupportedException sort 中仅允许使用字段 Que
  • python3 super 不适用于 PyQt 类

    python3中有一个简单的程序 from PyQt4 import QtCore import PyQt4 class Bar object def init self print Bar start super Bar self ini
  • 如何从来宾操作系统获取 Citrix XenServer VM 的唯一 ID?

    假设我有多个同名的 Citrix XenServer VM 或者 这些名字都是垃圾 没关系 从其中一台虚拟机上的来宾操作系统中 我如何以编程方式确定虚拟机的 ID 我希望虚拟机的 UUID 应该作为来宾操作系统的 BIOS 序列号 但事实并
  • Typo3 流体图像裁剪,高度失败

    使用此代码
  • TouchJSON 返回可变对象吗?

    我从网络服务接收一些 json 我使用 TouchJSON 库解析它 我保留数据供用户更改某些值 然后我想将其返回到网络服务 我得到的 JSON 对象在对象中包含 NSDictionary 对象 如下所示 id null created a
  • 开源、多平台、基于浏览器的屏幕捕获扩展? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑一个项目 该项目涉及浏览器用户能够屏幕捕获任何网页的内容 最好是整个页面 而不仅仅是可见部分
  • 为什么 cqlsh 右对齐字符串?

    我发现使用 cqlsh 显示的字符串值是右对齐的 是否有一个原因 有没有办法左对齐字符串 cqlsh test gt create table test id int a ascii t text primary key id cqlsh
  • 当其中一个容器失败时,SSIS 包是否失败

    我有一个包含 1 个容器的包 如果该容器失败 ssis 包是否会失败 该物业 失败时失败包 对于容器来说是 false 这是否意味着只有当该属性设置为 TRUE 时包才会失败 否则只有容器状态失败 而包状态不是 是的 如果序列容器失败 则整
  • 获取webclient中通过AJAX生成的html

    我经常去某个网站查找资料 我心想 等等 我可以编程 当我可以编写一个为我做这件事的软件时 为什么我要手动访问这个网站呢 于是我开始了 我使用的是 C 所以我找到了 WebClient 和 Uri 我已经设法获取该网站的源代码 但出现的问题是
  • “弱参考”:需要脚踏实地的解释

    有人可以解释一下吗弱引用在德尔福 我注意到这个概念经常在我仔细检查的一些库 框架源代码中提到 我陷入了困境 想要对其有一个清晰的了解 通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态 弱引用用于打破 让彼此活着 的熊抱
  • 无法实例化 DatePipe

    我正在尝试实例化一个DatePipe我的 Angular2 应用程序中要使用的对象transform 我正在开发的组件中的功能 import DatePipe from angular common Component export cla
  • Android SecurityException:uid xxxxx 无法显式添加帐户

    我收到错误消息 java lang SecurityException uid 10178 cannot explicitly add accounts of type net roughdesign swms 即使是我可以创建的最基本的示
  • 带有 RuntimeWarning 的 numpy 除法:double_scalars 中遇到无效值

    我写了以下脚本 import numpy d numpy array 1089 1093 e numpy array 1000 4443 answer numpy exp 3 d answer1 numpy exp 3 e res answ
  • Python从大型文本文件中读取完整行的块(列值拆分为多行)

    我想分块读取一个大的 txt 文件 c 2 5GB 然后在加载到数据库之前执行一些操作 该文件只有 2 列 列分隔符为 并且有资格double quotes 第二列中的值可以跨越多行 下面的示例 我想用这个answer https stac
  • 如何减少大量包装类的实现代码?

    我正在开发一个包含一些类的库 我们称它们为C1 C2 and Cn 这些类中的每一个都实现一些接口 即I1 I2 Im n gt m 库中对象之间的关系很复杂 我必须 为我的库用户提供一些 API 以使用智能指针访问这些对象 经过一番讨论