创建一个变量来保存不同类型的对象 C++

2023-12-13

我有 3 个不同的对象A, B and C。根据给定的参数,我想在这些不同的对象中进行选择。在编程中,

class A { 
  public: 
    void printHello() { cout << "HELLO A" << endl; }
}; 

class B { 
  public: 
    void printHello() { cout << "HELLO B" << endl; }  
};

class C { 
   public: 
     void printHello() { cout << "HELLO C" << endl; }  
}; 

int main () { 
    string key = "c"; 
    A a; 
    B b; 
    C c; 
    Object obj; // I don't know how to declare Object. 

    if (key == "a") obj = a; 
    else if (key == "b") obj = b; 
    else obj = c;
    obj.printHello(); // print Hello C.
    return 0; 
} 

我考虑过模板和结构对象。但到目前为止,它们都不起作用。

template<typename T1, T2, T3> 
T1 getType(string key, T1 t1, T2 t2, T3 t3) { // this is problem coz return types are different.
    if (key == "a") return t1; 
    else if (key == "b") return t2; 
    else return t3; 
} 

很容易创建Object o; in JAVA因为Java中的每个对象都是Object班级。但是我如何在 C++ 中实现这一点呢?

编辑。 我无法转班级A, B and C。我被安排了这些课程,我的目标是实施main方法。所以,inheritance对我来说这是不可能的。抱歉造成任何混乱。

任何帮助表示赞赏。


您正在寻找一个variant类型。有一个即将到来的std::variant在 C++17 和 C++11 兼容版本中boost和网络周围。示例为boost::variant:

struct visitor
{
    void operator()(const A&){ cout << "HELLO A" << endl; }
    void operator()(const B&){ cout << "HELLO B" << endl; }
    void operator()(const C&){ cout << "HELLO C" << endl; }
};

int main()
{
    visitor v;

    // `obj` is either an `A`, a `B` or a `C` at any given moment.
    boost::variant<A, B, C> obj{B{}};
    //                         ^^^^^
    //                   Initialize with `B`.

    boost::apply_visitor(v, obj); // prints "HELLO B"

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

创建一个变量来保存不同类型的对象 C++ 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 从另一个非静态方法调用非静态方法

    Given myClass下面和非静态方法run 下面的代码行是有效的 new myClass move 然而 这也是有效的 move 我理解第一次尝试 new myClass move 创建该类的实例 然后调用它的方法 第二次尝试是否也隐
  • 如何在代码突出显示活动行时保持初始单元格颜色

    我有这个工作簿代码 Private Sub Workbook SheetSelectionChange ByVal Sh As Object ByVal Target As Range toggles worksheet colors co
  • 如何更改android中tabhost的字体大小

    如何更改选项卡的字体大小 我为选项卡扩展了 TabActivity 您可以定义主题 使用样式来实现此目的 首先创建主题 名称 CustomTheme 为您Activity在你的res values styles xml
  • 将对象上传到 Amazon s3 时如何为其设置 ACL?

    我可以将图像从 Android 上传到 Amazon s3 但它们始终是私人的 没有人可以展示它们 我必须在 Amazon s3 管理控制台上公开它 我无法在上传图像时为其设置 ACL 我了解到 有两种方法可以将图像从Android上传到A
  • 在每行列之间插入零的行和列

    如果我有一个MxN矩阵 我如何在matlab中原始矩阵中的每隔一列 行之后添加 而不是替换 一行零和一列零 实际上结果将是 2Mx2N 您可以通过以下方式进行操作 不要添加新的行和列 而是创建一个空矩阵并填充原始矩阵中的元素 创建一个具有维
  • 正则表达式在 VS Code 中查看后面?

    我正在 VS Code 中开发语法扩展 但在查看正则表达式模式背后遇到了困难 给定以下字符串 我只想返回cmp当它前面是 fmt fmt cmp foo 我在另一个编辑器中使用的匹配字符串是这样的 lt fmt w 但是 这在 VS Cod
  • 如何使用abs使搜索菜单项在操作栏中显示完整视图

    我在操作栏中有五个操作菜单项 我正在使用操作栏 sherlock 库 如下所示 In onCreateOptionsMenu 我使用了以下代码 menu add 0 1 0 Settings setShowAsAction MenuItem
  • LinkedIn SDK 位码 iOS 9

    适用于 iOS 的 LinkedIn SDK 仍然不支持 Bitcode 什么时候可以使用 有什么办法可以解决 iOS 9 上的这个问题吗 到目前为止 我已经尝试在 pbxproj 文件上禁用 Bitcode 支持 但这对于整个项目来说并不
  • Android Studio Youtube 导入存在问题。 “无法解析 YouTubePlayerSupportFragment”

    我正在尝试使用 Android Studio IDE 在应用程序中开发 YouTube 功能 这是我目前的代码 The issue is surrounding the imports Now I have the JAR file imp
  • 将 int 格式设置为电话号码

    有没有办法可以将例如 0000000000 格式化为 000 000 0000 我正在返回一个列表框 其中包含尚未格式化的电话号码集合 我想要的是格式化它 这就是我在视图中的内容 并从控制器 ViewData phoneList new S
  • C++ - 编译器如何决定以引用类型作为参数的重载函数?

    在学习 C 时 我遇到了转换序列这一复杂的主题 并且遇到了一个我自己无法解决的问题 void g const double std cout lt lt void g const double lt lt std endl void g c
  • 来自线程池的 QNetworkAccessManager

    一个非常基本的问题 该文档提到 所有方法QNetworkAccessManager是可重入的 如果是这样 正在执行get 方法在一个QRunnable没有锁合法吗 我的代码看起来像这样 class MyClass public QRunna
  • 给定两个目录树,如何找出哪些文件的内容不同? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 如果我想找到两个目录树之间的差异 我通常只需执行 diff r dir1 dir2 这准确地输出了相应文件之间的差异 我只想获取内容不同的相应文件的列表 我认为这只是将命令行选项传递
  • 如何仅序列化 Jackson 孩子的 ID

    使用 Jackson fasterxml jackson 2 1 1 时是否有内置方法仅序列化孩子的 id 我们想发送一个Order通过 REST 有一个Person参考 然而 person 对象非常复杂 我们可以在服务器端刷新它 所以我们
  • javascript中从子窗口刷新父窗口

    我已经寻找了一段时间 找不到适合我需求的答案 我有一个页面弹出一个窗口 window open 让用户登录 创建cookie 设置会话 然后重定向到另一个页面 当模态重定向时 我想刷新父页面 这样我刚刚做的所有好东西都会被父页面识别 我尝试
  • 数据库设计:被其他实体引用的“代码”表

    我正在构建一个数据库作为一个简单的练习 它可以托管在任何数据库服务器上 所以我试图尽可能保持标准 基本上我想做的是一个被其他实体引用的 代码 表 我解释 xcode id code r role p property code r admi
  • 在浏览器中使用 PHP 脚本运行 Composer

    想知道是否可以执行composer从带有一个 PHP 包装器的浏览器 因为我无权通过 shell 访问服务器 不确定是否可以使用 cURL 来做到这一点 Danack 解决方案的替代方案是包括 composer composer 作为一个
  • apache 上的 Django 与 mod_wsgi (Linux) - 403 禁止

    好的 所以我正在关注this教程 当我尝试通过本地服务器访问我的网站时 我收到这个奇怪的错误 Forbidden You don t have permission to access on this server Apache 2 4 6
  • 如何使用java从SVN存储库获取所有文件和目录

    我有一个任务要完成 我想连接到 SVN 存储库 并且必须使用 java 代码将所有目录和文件从 svn 下载到我的本地系统 我对此很陌生 并尝试使用示例来读取单个文件内容http svnkit com kb dev guide commit
  • 创建一个变量来保存不同类型的对象 C++

    我有 3 个不同的对象A B and C 根据给定的参数 我想在这些不同的对象中进行选择 在编程中 class A public void printHello cout lt lt HELLO A lt lt endl class B p