C++、多态性和迭代器

2024-03-21

我想要一个存储接口(抽象类)和一组存储实现(SQLite、MySQL、Memcached..),用于存储已知类的对象并从存储中检索子集。
对我来说,清晰的界面是:

class Storable{int id; blah; blah; blah; string type;};
class Storage{
    virtual Storage::iterator get_subset_of_type(string type) = 0;
    virtual Storage::iterator end)_ = 0;
    virtual void add_storable(Storable storable) = 0;
};

然后创建实现该接口的存储实现。现在,我的问题如下:

  • 迭代器不能是多态的,因为它们是按值返回的。
  • 我不能只为给定的 Storage 实现子类 Storage::iterator
  • 我考虑过使用一个包装迭代器来包装存储实现子类的多态类型并执行 pimpl 操作,但随后我需要使用动态内存并在各处进行分配。

有什么提示吗?


如果你想要一个用于迭代的虚拟接口,像这样的东西?

#include <iostream>
#include <iterator>

struct Iterable {
    virtual int current() = 0;
    virtual void advance() = 0;
  protected:
    ~Iterable() {}
};

struct Iterator : std::iterator<std::input_iterator_tag,int> {
    struct Proxy {
        int value;
        Proxy(const Iterator &it) : value(*it) {}
        int operator*() { return value; }
    };
    Iterable *container;
    Iterator(Iterable *a) : container(a) {}
    int operator*() const { return container->current(); }
    Iterator &operator++() { container->advance(); return *this; }
    Proxy operator++(int) { Proxy cp(*this); ++*this; return cp; }
};

struct AbstractStorage : private Iterable {
    Iterator iterate() {
        return Iterator(this);
    }
    // presumably other virtual member functions...
    virtual ~AbstractStorage() {}
};

struct ConcreteStorage : AbstractStorage {
    int i;
    ConcreteStorage() : i(0) {}
    virtual int current() { return i; }
    virtual void advance() { i += 10; }
};

int main() {
    ConcreteStorage c;
    Iterator x = c.iterate();
    for (int i = 0; i < 10; ++i) {
        std::cout << *x++ << "\n";
    }
}

这不是一个完整的解决方案 - 我还没有实施Iterator::operator==, or Iterator::operator->(如果包含的类型是类类型,则需要后者)。

我将状态存储在 ConcreteStorage 类中,这意味着我们不能同时在同一个存储上有多个迭代器。所以可能而不是Iterable作为 Storage 的基类,需要有另一个 Storage 虚拟函数来返回新的Iterable。事实上,它只是一个输入迭代器,这意味着迭代器的副本都可以指向同一个Iterable,这样就可以通过shared_ptr(或者Itertable应该有一个虚拟析构函数,或者 newIterator 函数应该返回shared_ptr, 或两者)。

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

C++、多态性和迭代器 的相关文章

  • Python 的局限性是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我花了几天时间阅读有关 C 和 Python 的内容 发现 Python 非常简单且易于学习 所以我想知道它真的值得花时间学习吗 或者我应该花时
  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • Polly 策略记录异常并重新抛出

    我考虑使用Polly https github com App vNext Polly handing return values and policytresult创建策略来记录异常并重新抛出 我没有找到允许它开箱即用的现有方法 但我看到
  • 如何使用 C# 获取打印作业状态

    我可以打印文档 但不知道如何获取其状态 我查阅了很多资源 MSDN http support microsoft com kb 322091 检查工作状态的链接 https stackoverflow com questions 55637
  • 指向基类的基本多态指针

    虽然我已经在 C 领域工作了一段时间 但直到现在我才需要使用多态特性 而且我对它们非常感兴趣 如果我有一个基类ClassA和另一个ClassB从中衍生出来 我明白我可以拥有virtual中的成员函数ClassA即 当实施于ClassB 将被
  • 如何序列化其类相互引用的类层次结构,但避免 XmlInclude?

    我有一个类的层次结构 我想使用XmlSerializer类及其相关属性 有一个基本抽象类 然后是相当多的派生类 在下面的代码中 我已将派生类的数量减少到五个 但实际代码中还有更多 这些类形成一个层次结构 并且经常包含对层次结构中类的实例的引
  • 在 C 中从数组创建子数组的最佳方法

    我有一个数组说a 3 1 2 5 我必须创建另一个数组a2 2 2 5 我尝试过的是创建一个新数组a2 只需复制所需位置范围内的所有元素即可 在C语言中还有其他方法可以实现这一点吗 memcpy a2 a 1 2 sizeof a
  • std::ostream 需要功能帮助

    我需要有人逐步向我解释这些代码行 并且我需要一些帮助来使用 ostream 和简单的示例 谢谢 inline std ostream operator lt lt std ostream os const Telegram t os lt
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • 使用 Opengl 绘制立方体 3D

    我想使用 OpenGL 绘制 3D 立方体这是我的代码如何纠正错误 float ver 8 3 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
  • EF Core:同时使用ID作为主键和外键

    我有两个实体 Prospect and Person 我想做的是使用Prospect ID作为主键Prospect表并作为外键PersonID 我的想法是对两个实体使用相同的 ID 而不需要PersonID on my Prospect实体
  • 为什么无法在 android 中包含 iostream?

    已安装 android ndk r7 并尝试编译 cpp 文件 include
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • C#:模拟内存泄漏

    我想用c 编写以下代码 a 模拟内存泄漏的小型控制台应用程序 b 小型控制台应用程序 它将调用上述应用程序并立即释放它 模拟管理内存泄漏问题 换句话说 应用程序 b 将不断调用并释放应用程序 a 以模拟如何遏制 叛逆 内存泄漏应用程序 而不
  • BigInteger 乘以 Double

    我的物理老师给全班布置了一项艰巨的任务 我正在尝试创建一个程序来为我计算一些事情 在某个时刻 我需要将分子数量乘以百分比 Ulong 不能容纳大到 6022 10 19 的数字 所以我必须使用 net 4 0 中的 BigInteger 但
  • Excel 中的单元格“数字存储为文本”

    我有一个 C 程序 它获取旧报告的文本文件并映射到 Excel 工作表 但对于交易单元格 它输出为 数字存储为文本 这不允许 任何格式 我们想要显示 1 000 00 但它仅显示为 1000 有什么办法可以得到这种格式吗 这些列是余额和金额
  • NullValueHandling.Ignore 使用 JsonConverter::WriteJson

    我正在尝试执行自定义序列化 所有快乐路径代码都可以工作 但空值路径的行为并不像我想要的那样 我已将序列化器设置设置为NullValueHandling Ignore我的对象图的其他部分为空 并且不使用我的自定义序列化 已删除空值 看起来 N
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • 为什么IL代码中stloc.0后面有一个ldloc.0?

    我正在尝试通过编写小代码片段和检查编译的程序集来学习 CIL 所以我写了这个简单的 if 语句 public static void Main string args Int32 i Int32 Parse Console ReadLine
  • 无法使用 openxml 在 PPT 报告中生成第二个表

    我有这个代码 我能够完美地生成带有文本数据的 pptx 报告 我在这份报告中还有 4 个表格 其中包含动态数据 我可以在 PPT 中生成一张表格 但无法生成多个表格 Requirement On the right I have 4 tab

随机推荐

  • 如何在 tkinter 文本小部件中突出显示文本

    我想知道如何根据某些模式改变某些单词和表达方式的风格 我正在使用Tkinter Textwidget 我不知道如何做这样的事情 与文本编辑器中语法突出显示的想法相同 我不确定这是否是用于此目的的正确小部件 它是用于这些目的的正确小部件 基本
  • Django Rest框架批量创建

    我正在尝试制作一个 api 您可以使用 django Rest 框架通过单个 Post 请求创建多个对象 但是 我的序列化器提供了一个我不明白的错误 首先这是我的代码的骨架 我的序列化器 class MyModelSerializer se
  • MIPS——这重要吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题 了解 MIPS 编程语言有用吗 我是一名计算机科学学生 正在上一门以 MIPS 为重点的汇编课程 我很擅长使用高级语言进行编写 但 M
  • 类型错误:不是构造函数

    我只是将代码用作有关 JavaScript 类的学习练习 该代码产生 TypeError SimpleLogger 不是构造函数 该类似乎已导出 但我无法在 main js 文件中实例化它 我已经减少了代码以仅显示问题 我想知道是否有人能发
  • 从 ant 类路径中排除 jar

    我正在尝试在一些使用 ant 脚本的遗留项目上进行 干净的 Maven 设置 我对蚂蚁了解不多 所以我的问题可能显得很幼稚 我快完成了 但是由于类路径中存在冗余 交付蚂蚁脚本失败了 如果我理解构建 这些行应该添加到 提供 范围内每个库的类路
  • 多个构造函数与 Structuremap 改变范围?

    为了说明问题 这是我的设置的简化版本 我有一家这样的工厂 public interface IFactory public class Factory IFactory public Factory Console WriteLine pa
  • 同一 AWS Cognito 用户池中的多个应用程序对于同一用户来说 cognitoID 是否相同?

    我有一个 Cognito 用户池 可以与我的 iOS 和 Android 应用程序配合良好 该池有一个客户端密钥 我现在想建立网络身份验证 Cognito 的 javascript sdk 不支持使用应用程序客户端密钥配置的用户池 假设我在
  • Google 的 Vision Api protobuf 对 Python 字典的响应对象

    我正在开发一个项目 需要使用 Google 的 Vision API 分析图像并将响应发布到 Dynamodb 表 我已经成功实现了 Vision API 但无法将其响应转换为 Python 字典 这是我尝试过的 if form is va
  • Pandas DF 有一列包含列表。如何使用此列表的每个值重复行?

    我有一个像这样的熊猫数据框 title author year type 0 t1 a1 1980 article 1 t2 a2 a3 a4 1983 article 2 t3 a5 1982 article 3 t4 a6 1977 a
  • jQuery 验证中的正则表达式 - jQuery 中的单引号问题

    我有一个正则表达式来验证密码是否包含数字 小写和大写字符 下面这个效果很好 但是当我在 jQuery 验证中使用它时 txtPassword required true regex Regex Regex 8 16 d a z A Z am
  • 如何使用脚本重新创建 IPython 的“--pylab”选项的效果?

    我想创建一个与 IPython 执行相同操作的配置文件 pylab 用手 标记 为了实现这一目标 脚本的内容应该是什么 包导入 名称空间指定 设置等 作为替代方案 我还想知道是否有一种方法可以检查 pylab当前 IPython 会话启动时
  • 什么是 ls -F (ls --classify) [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 看着普通旧版的手册页ls http linux die net man 1 ls我看到有一个标志 F F classify append
  • Int 转换不起作用[重复]

    这个问题在这里已经有答案了 我正在为我的游戏创建高分功能 但无法让它发挥作用 这是我的方法 def game over self Game over Screen keys pygame key get pressed self gameo
  • 正则表达式麻烦,转义引号

    基本上 我正在传递一个字符串 我需要以与 nix shell 标记命令行选项大致相同的方式对其进行标记 假设我有以下字符串 Hello World Hello Universe Hi 我怎样才能把它变成一个三元素列表 你好世界 你好宇宙 H
  • magento 产品页面中买家需填写的字段

    我一直在寻找 但找不到类似的东西 我需要创建一个产品页面 买家在将产品添加到购物车之前将在其中填写一些文本字段 大部分类似于此页面的内容 http bitly com Sw4jzR http bitly com Sw4jzR 添加到购物车时
  • 在容器和主机之间共享“node_modules”文件夹

    这是一个非常热门的话题 但我从未真正找到解决方案 您可能知道 当我们在容器中有一个卷并且安装依赖项时 使用npm i或其他东西 从 Dockerfile 具有默认权限 Npm 将创建一个node modules容器中的文件夹root roo
  • 使用多线程 vb.net 时更新文本框

    My code Imports System IO Public Class Form1 Dim thread As System Threading Thread Dim thread2 As System Threading Threa
  • 如何在Python中比较两个时区?

    Example import pytz b pytz timezone Europe Rome c pytz timezone Europe Berlin 然而 这两个时区具有不同的名称但代表相同的事物 b c 返回 false b zon
  • RStudio Run命令运行两次问题[重复]

    这个问题在这里已经有答案了 我在使用 RStudio 时遇到了一个奇怪的问题 当我使用任何命令运行脚本时 例如 Ctrl R Ctrl Enter 或 RStudio 上的实际运行命令 该命令会运行两次 我在互联网上找不到任何与此相关的信息
  • C++、多态性和迭代器

    我想要一个存储接口 抽象类 和一组存储实现 SQLite MySQL Memcached 用于存储已知类的对象并从存储中检索子集 对我来说 清晰的界面是 class Storable int id blah blah blah string