【问题标题】:Looking for a pointer ignoring instruction when null寻找指针忽略指令时为空
【发布时间】:2020-06-30 14:51:19
【问题描述】:

我使用了一个监控类Progress。在很多功能中,如果给定,我会更新进度。进度变量是可选的,由可以为空的指针给出。我的很多部分代码如下所示:

void do_the_job(Progress* progress)
{
  do_part_1();
  if((bool)progress)
    progress->set(0.25f);
  do_part_2();
  if((bool)progress)
    progress->set(1.0f);
}

在自己创建它之前,我正在寻找一种智能指针来检查它是否为 null,如果为 null,则忽略调用。 可以像这样使用的东西:

void do_the_job(boost::could_be_null_ptr<Progress> progress)
{
  do_part_1();
  progress->set(0.25f); // ignored if null
  do_part_2();
  progress->set(1.0f); // ignored if null
}

出于兼容性原因,我不使用 C++11 或 >C++11。请只使用 C++03 的解决方案。

【问题讨论】:

  • 当然没有理由在一个函数中多次检查它。您可以在函数的开头使用if (!progress) return;。另一个选项可能适用于调用所有这些函数的上下文,以确保它不会传递空值,具体取决于代码的该部分是如何设计的。
  • 你不能使用条件吗?
  • 这能回答你的问题吗? Is there a safe navigation operator for C++?stackoverflow.com/questions/1785426/… 或更多。剧透:不,这不能完成,也不能在库中编码,甚至在现代版本的 C++ 中也不能。
  • if((bool)progress) 是毫无意义的冗长,只是做if(progress)
  • @lurker 进度只是一个监控工具。 (例如进度条)。如果指针为空,函数必须做的工作,只是忽略进度对象的更新。

标签: c++ pointers c++03


【解决方案1】:

该函数不必为空指针而烦恼,因此设计Progress 使其可以像这样使用:

void do_the_job(XProgress& progress)
{
  do_part_1();
  progress.set(0.25f);
  do_part_2();
  progress.set(1.0f);
}

到达那里很简单:

struct XProgress {
   std::shared_ptr<Progress> instance;
   void set(float x) {
       if (instance) instance->set(x);
   }
};

在任何情况下,您都需要一些可以调用set 的实例,因此无法避免重新实现Progesss 接口。

对不起,错过了“唯一的 C++03”。如果您不能使用shared_ptr,请使用您选择的内存管理机制。如果禁用复制,在XProgress 析构函数中删除的原始指针可能没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2014-05-12
    • 2014-01-06
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2019-03-07
    相关资源
    最近更新 更多