我正在写一个返回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*
输出。
谢谢和问候。
答案 0 :(得分:1)
要指示您通过指针返回的内容尚未初始化,请使用return NULL
。并使用if(double* d = method())
(或您喜欢的任何其他方式)检查它。
然而,这不是你的(或我的)祖父C ++,你应该只写这样的东西,当你绝对有理由这样做时。我希望返回值为std::array
或std::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有点复杂且无用。
返回未初始化的指针将不允许你对它进行布尔评估,这很危险,因为这样的指针将被假定为后来悬挂指针。