如何有条件地实例化不同的子类?

2024-04-21

例如,在main函数中,我想获取用户的输入。根据输入,我将创建一个Rectangle or a Circle,它们是子类Object。如果没有输入(或未知),那么我将只创建一个通用对象。

class Object
{ 
       public:
           Object();
           void Draw();
       private:
           ....  
};
class Rectangle:public Object
{ 
       public:
           Rectangle();
           .... //it might have some additional functions
       private:
           ....  
};

class Circle:public Object
{ 
       public:
           Circle();
           .... //it might have some additional functions
       private:
           ....  
};

主功能:

string objType;
getline(cin, objType);

if (!objType.compare("Rectangle"))
     Rectangle obj;
else if (!objType.compare("Circle"))
     Circle obj;
else 
     Object obj;

obj.Draw();

当然,上面的代码不起作用,因为我无法在 If 语句内实例化对象。所以我尝试了这样的事情。

Object obj;
if (!objType.compare("Rectangle"))
    obj = Rectangle();
else if (!objType.compare("Circle"))
    obj = Circle();


obj.Draw();

这段代码可以编译,但它不会做我想要的。由于某种原因,该对象没有按照子类应有的方式启动(例如,我在子类中以不同的方式设置了某些对象的成员变量,特别是向量)。然而,当我在 Child 类构造函数中放置一个断点时,它确实从那里运行了。

那么我应该如何在一些 if 语句中将实例化对象作为其子类?


You can创建自动对象if语句,但它们将在创建它们的作用域结束时被销毁,因此它们无法解决此问题。

你不能这样做的原因obj = Rectangle()其一是因为slicing https://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c.

你必须有一个指向Object。指向基对象的指针也可以指向子对象的实例。然后就可以在里面动态创建对象了if with new(使用创建的对象new忽略范围并且仅在您调用时才被销毁delete指向它们的指针),然后delete当你完成后:

Object* obj = NULL; // obj doesn't point to anything yet
string objType;
getline(cin, objType);

if (objType == "Rectangle")
    obj = new Rectangle; // make obj point to a dynamic Rectangle
else if (objType == "Circle")
    obj = new Circle; // make obj point to a dynamic Circle
else
    obj = new Object;  // make obj point to a dynamic Object

obj->Draw(); // draw whatever shape obj really points to

delete obj; // deallocate dynamic object

或者,您可以使用智能指针,然后您不必担心手动释放对象:

std::unique_ptr<Object> obj(NULL); // obj doesn't point to anything yet
string objType;
getline(cin, objType);

if (objType == "Rectangle")
    obj.reset(new Rectangle); // make obj point to a dynamic Rectangle
else if (objType == "Circle")
    obj.reset(new Circle); // make obj point to a dynamic Circle
else
    obj.reset(new Object);  // make obj point to a dynamic Object

obj->Draw(); // draw whatever shape obj really points to

// the unique_ptr takes care of delete'ing the object for us
// when it goes out of scope
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有条件地实例化不同的子类? 的相关文章

  • 删除字符串 C 的第一个字符

    我试图删除字符串的第一个字符并保留其余部分 我当前的代码无法编译 我对如何修复它感到困惑 My code char newStr char charBuffer int len strlen charBuffer int i 1 char
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 控制器中的异常处理 (ASP.NET MVC)

    当您自己的代码抛出异常并从控制器中的操作调用时 应该如何处理 我看到很多最佳实践的例子 其中根本没有 try catch 语句 例如 从存储库访问数据 public ViewResult Index IList
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 需要使用 openssl 加密和解密文件的示例 C 代码

    我正在用 Linux C 编写代码 我需要使用以下命令来加密和解密文件 openssl 目前 我使用系统命令 des3 e nosalt k 0123456789012345 in inp file out out file 进行加密 使用
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 致命错误 C1001:编译器中发生内部错误(编译器文件“msc1.cpp”,第 1325 行)

    当我编译代码时 错误指向以下类 该错误在两行上突出显示 如下所示 tm validFrom tm validUntil struct t SslCertData final struct t Contact TCHAR Organizati
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs
  • FakeItEasy 代理方法调用实际实现

    我正在尝试将对假对象的调用代理到实际的实现 这样做的原因是我希望能够使用 Machine Specifications 的 WasToldTo 和 WhenToldTo 它们仅适用于接口类型的伪造 因此 我正在执行以下操作来代理对我的真实对

随机推荐

  • HTTP 状态 404 – 在 Spring boot 中未找到

    我是 Spring Boot 的初学者 我想在spring boot中编写HelloWorld编程 我在运行项目时做了一个 我得到的错误是 HTTP Status 404 Not Found 到目前为止我所尝试的内容附在下面 请帮助我写出一
  • Unix 时间戳到 FAT 时间戳

    我正在尝试将时间结构转换为 FAT 时间戳 我的代码如下所示 unsigned long Fat tm struct pTime unsigned long FatTime 0 FatTime pTime seconds 2 gt gt 1
  • Firebase/Google Cloud Function 中 HTTP 请求的多次返回

    我有一个云函数 可以对我的数据库进行一些搜索 这是一个相当昂贵的过程 涉及大量的计算 它的目标是找到最好的匹配 当找到好的匹配项时 我无法提前退出 因为可能会在迭代周期的后期找到更好的匹配项 因此 理想情况下 我想定期向客户更新迄今为止最好
  • 如何使用多个XMLHttpRequest?

    我需要从 8 个不同的 URL 获取 8 个 JSON 我将必须更改的查询字符串存储在数组中 并使用 for 循环遍历它 这是我的代码 var index ESL SC2 OgamingSC2 cretetion freecodecamp
  • 通过函数更改字符串值[重复]

    这个问题在这里已经有答案了 我注意到我的代码有很多这样的语句 var some string var some func var var another func var print var outputs modified string
  • '%(FullPath)...”' aria-label='NuGet 包失败并显示“无法找到 '@(_OutputPathItem->'%(FullPath)...”'> NuGet 包失败并显示“无法找到 '@(_OutputPathItem->'%(FullPath)...”

    我正在尝试我的第一个 NuGet 包 但遇到了一些麻烦 我有一个相当简单的项目和一个非常简单的 nuspec 文件
  • HTML 表单动作搜索,1 个文本框,2 个按钮,2 个可能的结果

    这些天我正在尝试做一个搜索表单 该表单发送到两个不同的页面 其中有两个不同的按钮和一个文本框 到目前为止我正在这样做
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • 如何在 WordPress 短代码中使用 AJAX?

    我有一个代码来显示随机报价 有人编写了一个函数来实现这一切 但由于某种原因通过AJAX更新数据不起作用 当您按下 新报价 按钮时 什么也没有发生 也许有人知道为什么 以下代码中需要修复什么 以便当您单击 新报价 时加载新报价 The PHP
  • 如何实施IDEA?

    我必须制作一个可以使用 Java 或 C 中的 IDEA 国际数据加密算法 加密和解密文本文件的应用程序 我知道Java中有一个内置的JCE Java加密扩展 但是我该如何进一步进行 有人能给我一些建议吗 由于某种原因无法发表评论 所以我将
  • 将先前的提交分解为多个提交

    如果不创建分支并在新分支上做一堆时髦的工作 是否可以在将单个提交提交到本地存储库后将其分解为几个不同的提交 git rebase i http git scm com book en v2 Git Tools Rewriting Histo
  • 如何在 EF 4.1 RC 中的 DbContext 级别关闭更改跟踪?

    我遇到了一个似乎很常见的问题 我正在更新数据库中的值 但 EF 正在使用对象的原始内存副本 并且这些更改的值不会反映在显示的数据中 我明白这是为什么 但我无法找到解决方法 最常见的解决方案似乎是设置MergeOptions NoTracki
  • OpenCV SURF功能未实现

    当我尝试运行示例时find obj cpp或任何 OpenCV SURF 程序 在执行代码时 我在命令提示符中收到以下错误 该项目构建时没有错误和警告 我使用的是 VS2011 beta OpenCV 2 4 和 windows7 错误信息
  • 附加搜索词时如何重用 jquery-ui-autocomplete 缓存结果?

    我有以下 JS 方法将 jQuery UI 自动完成小部件绑定到搜索文本框 一切工作正常 包括缓存 但在附加搜索词时我进行了不必要的服务器调用 因为我不重用刚刚检索的结果 例如 搜索 ab 会从服务器获取一些结果 在搜索框中的 ab 后面键
  • 从网络下载已使用 wavesurfer.js 修改的音频

    我使用wavesurfer js 创建了一个多轨网络播放器 它可以调整不同轨道的级别和平移 我想要做的是将具有新级别的混合曲目导出并将平移作为单个 wav 文件 我对此做了一些研究 很多人都指出https github com mattdi
  • 如何使用 Oracle 清理死连接?

    现在 我正在针对 Oracle 数据库开发一些新应用程序 有时它们会崩溃或无法正确结束 等等 无论如何 问题是它们有时似乎保持连接打开 我需要在它们之后进行清理 我的问题是 是否有一种方法可以从数据库端确定死连接并清理它们 这是一个页面 涉
  • C# 3.5 ASP.net 文件 IO 问题,网络共享上的文件出现 UnauthorizedAccessException

    每次我尝试访问时都会收到 UnauthorizedAccessException 只是read 网络共享上的文件 服务器 文件夹1 文件夹2 文件 pdf 我正在模拟对上述文件夹具有读写访问权限的域 aspnet 用户 该文件不是只读的 我
  • TextInputLayout.passwordVisibilityToggleRequested 上的 NullPointerException

    我在 Firebase 崩溃报告中收到有关以下内容的错误Password toggle button在某些真实设备中处于发布模式的应用程序上 问题是堆栈跟踪错误的全部内容android support design您将在从 Firebase
  • livereload 不提供地址选择

    更新node js后 我发现了这个问题 当我运行 ionic cordova run android livereload 时 它在本地主机中运行 我该如何解决这个问题 请帮我 离子信息 Ionic CLI 5 2 1 Ionic Fram
  • 如何有条件地实例化不同的子类?

    例如 在main函数中 我想获取用户的输入 根据输入 我将创建一个Rectangle or a Circle 它们是子类Object 如果没有输入 或未知 那么我将只创建一个通用对象 class Object public Object v