题
我的工作在C++我需要知道,如果一个标值(例如一个 double
)是"定义"或不行。我还需要能够"民主基金",它如果需要的话:
class Foo {
public:
double get_bar();
private:
double bar;
void calculate_bar() {
bar = something();
}
};
double Foo::get_bar() {
if ( undefined(bar) )
calculate_bar();
return bar;
}
是否有可能在C++?
感谢
解决方案
作为其他的答案说,C ++没有这个概念。您可以轻松地解决它虽然。
或者您可以具有在构造初始化栏未定义的值,典型地-1.0或类似的东西。
如果你知道calculate_bar不会返回负值,您可以实现未定义功能为<0.0的检查。
一个更通用的解决方案是具有布尔说杆是否被定义但你在构造初始化为假并且在第一次设置将其更改为true。 的boost ::可选做到这一点的优雅的模板的方法。
这是你的代码示例将是什么样子。
class Foo {
public:
double get_bar();
Foo() : barDefined(false) {}
private:
double bar;
bool barDefined;
void calculate_bar() {
bar = something();
}
};
double Foo::get_bar() {
if ( barDefined == false ) {
calculate_bar();
barDefined = true;
}
return bar;
}
其他提示
正如其他指出的那样,有没有像一个“未定义”状态。但是你可能要考虑的 boost.optional
如果你的意思是在运行时,没有这样的事情。如果bar
从未初始化,它将有任何随机比特碰巧在那里,这取决于对象是如何分配的(一些分配器将初始化新的内存为全零)。
编辑:它是由程序员来处理在构造和/或手动初始化方法等init()
对象状态
为什么不保持该被初始化为假,然后计算栏时,被设置为true的分离标志。通过该标志再次设置为false它然后可以“undefed”。
if(!isBarValid)
{
calculateBar();
isBarValid = true;
}
return bar;
C ++不具有“未定义”状态的原始类型。最近的可用的浮点/双精度会NAN,但真正具有不同的含义。
这是不可能的在C / C ++,原语始终将分配一个值(主要是垃圾,无论是在该点在存储器中之前,除非在声明明确分配)。我是常见的具有占位符值(即0的指针),其表示未使用,然而,这些必须被明确分配为好。如果你的双能取任何值,那么我建议你把一个布尔旁边,分配到虚假的最初和测试/设置之一,当你想要做你的计算。
您必须使用一个额外的布尔做到这一点。
要实现使用一个额外的布尔值,你可以尝试像下面的模板逻辑:
template<typename T>
struct Defined
{
bool defined;
T value;
Defined() : defined(false) {}
Defined(const T& value_) : defined(true), value(value_) {}
... and perhaps other operators here ...
... to make this behave even more like a T ...
};
您可以尝试构建在第一次使用成语一>和写入get_bar()
这样:
double & get_bar()
{
static double *bar = new double(something());
return *bar;
}
当你调用get_bar()
它会使你bar
如果没有人要求它。任何后续调用只返回bar
。作为链接的网页说,这在技术上不泄漏内存,因为在程序退出时,操作系统会回收它。
更新:
改变的返回值来double &
到允许修改bar
。
初始化 bar
某些价值,它可从来没有发生,当你打电话的 something()
功能的构造。
例如:
Foo(): bar(-1)
{
}
然后检查的价值 -1
在 get_bar
功能。
(嗯Laserallan还发布这个问题的答案1分钟之前:-(;-))