c ++ - 测试指针

时间:2012-03-19 22:15:11

标签: c++ arrays

我正在写一个返回double*的方法。但是,我想基于此方法的输出建立另一种方法行为。我想要

if (methodReturningArray()==0)
{
    this_behavior();
}
else
{
    this_other_behavior(methodReturningArray());
}

是否适合methodReturningArray()返回'initialized'或'build'double*,如果无法正确初始化或构建此double*,则返回< / p>

double* new_array ;
return new_array ;

换句话说,double*输出也扮演布尔值的角色,以检查某些属性是否已完成,以便可以构建double*输出。

谢谢和问候。

2 个答案:

答案 0 :(得分:1)

要指示您通过指针返回的内容尚未初始化,请使用return NULL。并使用if(double* d = method())(或您喜欢的任何其他方式)检查它。

然而,这不是你的(或我的)祖父C ++,你应该只写这样的东西,当你绝对有理由这样做时。我希望返回值为std::arraystd::vector并且如果导致初始化失败的行为在某种程度上异常,则抛出异常。如果未能初始化是想法的一部分,我将返回值包装在boost::optional中。但是我可能会写一些需要OutputIterator来强制我的客户端上任何特定容器的东西。

灾难注意事项:double* d; return d将为您的客户端留下指向随机内存的指针。她无法确定是否必须deleted[]或是否有效。始终初始化指针。

代码段:

// outputiterator
template<typename OutputIterator>
void myFunc(OutputIterator o) {
  // fill stuff in
  if(someThing) {
    for(int i = 0; i < 5; ++i)
    {
      *o++ = 23;
    }
  } else {
    // leave it empty
  }
}

// client calls like:
std::vector<double> v;
myFunc(std::back_inserter(v));
if(!v.empty()) {

} else {

}

// exception
std::vector<double> myFunc() {
  std::vector<double> v;
  if(someThing) { v.push_back(23); return v; }
  else throw std::runtime_error("Nargh!");
}

// client
try {
  auto v = myFunc();
} catch(std::runtime_error err) {

}

// optional
boost::optional<std::vector<double>>
myFunc() {
  std::vector<double> v;
  if(someThing) { v.push_back(23); return v; }
  else return boost::optional< std::vector<double> >();
}

//client 
auto v = myFunc();
if(v) {

} else {

}

答案 1 :(得分:0)

基本上你有三种方法。

1)出错时,返回NULL。然后你可以毫无问题地进行布尔检查,并且在大多数情况下都足够了。

2)返回布尔值,并使用引用或指针参数处理double *输出,如下所示:

bool methodReturningArray(double **out) { *out = ...; return true; }

double *out;
if (!methodReturningArray(&out)) this_other_behavior(out); else ....

3)抛出异常 - IMO有点复杂且无用。

返回未初始化的指针将不允许你对它进行布尔评估,这很危险,因为这样的指针将被假定为后来悬挂指针。