C++:创建未初始化的占位符变量而不是默认对象

2024-01-02

我现在正从 Java 转向 C++,每当 Java 中常用的概念不能直接映射到 C++ 时,我就会遇到一些困难。例如,在 Java 中我会这样做:

Fruit GetFruit(String fruitName) {
    Fruit fruit;
    if(fruitName == "apple") fruit = new Fruit("apple");
    else if(fruitName == "banana") fruit = new Fruit("banana");
    else fruit = new Fruit("kumquat"); //'cause who really wants to eat a kumquat?

    return fruit;
}

当然,在C++中Fruit fruit;语句实际上创建了一个水果。这是否意味着我必须有一个默认构造函数?这看起来不安全!如果我的默认水果逃脱了怎么办?


当涉及到创建水果时,C++ 会让你更加头疼。根据您的需要,您可以选择以下选项之一:

1)在堆栈上创建一个 Fruit 并返回一个副本(您需要一个复制构造函数),然后必须提供一些默认的 Fruit 以防名称不匹配:

Fruit GetFruit(const std::string &name)
{
   if ( name == "banana" ) return Fruit("banana");
   if ( name == "apple" )  return Fruit("apple");
   return Fruit("default");
}

2)在堆上创建一个 Fruit 并注意,可能会返回空指针,并记住在某处删除该 Fruit 并注意它仅被删除一次且仅由其所有者删除(并注意没有人持有指向被删除水果的指针):

Fruit* GetFruit(const std::string &name)
{
   if ( name == "banana" ) return new Fruit("banana");
   if ( name == "apple" )  return new Fruit("apple");
   return NULL;
}

3)最后,使用智能指针来避免许多可能的指针问题(但要注意空指针)。此选项最接近您的 Java 编程经验:

typedef boost::shared_ptr<Fruit> FruitRef;

FruitRef GetFruit(const std::string &name)
{
   if ( name == "banana" ) return new Fruit("banana");
   if ( name == "apple" )  return new Fruit("apple");
   return FruitRef();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:创建未初始化的占位符变量而不是默认对象 的相关文章

随机推荐

  • 运行异步代码的 Windows 服务不等待工作完成

    In Brief 我有一个 Windows 服务 它可以并行执行多个作业作为异步任务 然而 当 OnStop 被调用时 似乎这些都被立即终止 而不是被允许以更优雅的方式停止 更详细 每个作业都代表工作的迭代 因此完成工作后 该作业需要再次运
  • 无法安装分发配置文件

    我想向 AppStore 提交一个应用程序 我的第一个应用程序 我已经在我的设备中测试了该应用程序 因此我已经有了开发配置文件 但我无法在 Xcode 中安装分发配置文件 我已按照该过程操作 我不知道多少次 但是当我尝试通过管理器添加配置文
  • 如何避免 Struts2 验证

    我有一个index jsp我从中调用一个动作类TestAction 单击超链接 其中有方法 显示 从数据库加载组合框的值以及执行方法 以显示在页面上test jsp On test jsp 我有一些输入字段和组合框 单击 test jsp
  • PHP 中单引号和双引号字符串有什么区别?

    我有点困惑为什么我在 PHP 中看到一些代码 其中的字符串放在单引号中 有时放在双引号中 我只知道在 NET或者C语言中 如果它是在单引号中 那就意味着它是一个字符 而不是一个字符串 Answer recommended by PHP co
  • 如何查明“svn up”是否成功完成?

    I run sudo svn username radek update codebase force 每天晚上在自动化测试开始之前从我的 php 脚本 在 SuSE 上 获取 因此 测试是在今天签入的最新代码上完成的 我怎么能确定知道sv
  • Gradle 无法解决 Android Studio 中的依赖关系

    我在 Android Studio 中导入了一个 Phonegap 项目 并将其设为基于 Gradle 的项目 现在我正在尝试编译一些外部依赖项 但出现此错误 错误 72 13 无法解析 com loopj android android
  • 类型“typeof“http””上不存在属性“服务器”

    我知道var someModule require someModule 一般被替换为import as someModule from someModule 但我不知道如何使用 Typescript ES6 语法来表达以下 Node js
  • 在 C# 中重置 IronScheme 引擎

    有没有办法 重置 IronScheme 引擎 我的本质目标是确保对 string Eval 的连续调用是独立执行的 例如 我想被执行 define x 1 0 x 5 0 Eval 然后重置并通话 x 3 0 Eval 失败就像它自己执行一
  • 使用 IE 11 的 Angular 4 应用程序“无法从释放的脚本执行代码”

    我有一个 Angular 应用程序 我认为它是版本 4 IE 11 在此应用程序中的登录序列期间崩溃 无法从释放的脚本执行代码 根据 IE 控制台 错误发生在 polyfills 包的第 10939 行 var testString del
  • C++ 中结构的奇怪行为 [第 1 部分]

    考虑 struct box int array 3 int main box a 1 如果上面的代码在 C 中有效 那么为什么下面的代码不起作用 struct box int simple int int main box b 2 是什么原
  • Android构建工具1.1.0,单元测试文件夹?

    我最近在我的 android 项目中安装了来自 google 的最新工具 buildscript repositories jcenter mavenCentral dependencies classpath com android to
  • 是什么触发为 AWS Lambda 访问 VPC 资源创建 ENI

    我们部署了多个 lambda 可以使用以下方式访问我们的 VPC VpcConfig环境 据我了解 AWS Lambda 通常会按需创建 lambda 但如果您将它们连接到您的 VPC 那么 AWS 将 在某些时候 在指定的子网之一上创建
  • 在 Windows 10 中使用 WPF 对大写单词进行拼写检查

    我有一个 WPF 应用程序 其中有一些文本框CharacterCasing CharacterCasing Upper也SpellCheck IsEnabled true 在 Windows 7 中 这工作正常 但在 Windows 10
  • Rails 中的业务逻辑在哪里?

    我是一名 ASP NET MVC 开发人员 刚刚开始我的第一个 Rails 大型项目 但是我很困惑将业务逻辑放在哪里 在 ASP NET 上 我创建了一个包含处理业务逻辑的服务 域驱动设计 的库 我听说 Rails 使用胖模型瘦控制器的概念
  • NestJS:每个模块导入 HttpModule 的新实例

    我的nestjs系统是一个通过API调用连接多个系统的系统 对于每个系统 我创建了一个模块来处理它们的进程 每个模块都导入HttpModule 我想为每个模块的 HttpModule 都有单独的 Axios 拦截器 这是我测试功能的尝试 o
  • Java 8 流条件处理

    我感兴趣的是将一个流分成两个或多个子流 并以不同的方式处理元素 例如 一个 大 文本文件可能包含 A 类型的行和 B 类型的行 在这种情况下我想要执行以下操作 File lines path filter line gt isTypeA l
  • 使用 mysql-proxy 操作登录信息

    是否可以在 mysql proxy 的 lua 脚本中拦截和更改登录信息 例如 如果用户像这样访问代理 mysql h localhost P 4040 u bob D orders p 我希望连接不仅重定向到后端服务器 而且还更改用户名
  • 如何将“2021-01-19T16:20:04+0000”解析为 time.Time

    我已经尝试过以下格式 应该可以捕获 0000我读到的时区偏移量https golang org pkg time pkg constants https golang org pkg time pkg constants ts err ti
  • 根据 Woocommerce 中的每日时间范围对特定产品进行折扣

    在我的 WooCommerce 网站上 我正在尝试举办 特别午餐 每日活动 这意味着 从 11 00 到 15 00 特定产品将因 午餐特惠 每日活动而打折 我希望这个 特别午餐 活动能够在一周的每一天重复发生 如何才能实现这一目标 我在网
  • C++:创建未初始化的占位符变量而不是默认对象

    我现在正从 Java 转向 C 每当 Java 中常用的概念不能直接映射到 C 时 我就会遇到一些困难 例如 在 Java 中我会这样做 Fruit GetFruit String fruitName Fruit fruit if frui