确定是否在C ++中初始化了非对象变量

时间:2010-10-05 18:33:02

标签: c++

所以,让我们说,在C ++的一个类中,我有各种各样的成员变量。结构,字符串,整数等等可能是任何东西。这些变量可以通过初始化该类的对象来设置,也可以不设置。给定int a,float b,char c,有时可以设置所有这些或者都不设置它们。设置它们后,可以将它们设置为变量的任何可能值。我想找到一些设置,并确定是否设置了变量:

1)大量的铸造。我总是可以创建一个具有布尔值的Data_Value装饰器类,并将其模板化为给定变量。这需要调用a_data_value.value和a_data_value.isInitialized。

2)许多额外的布尔变量。我宁愿没有bool a_initialized,bool b_initialized。

我真正想做的是这样的事情:

Python add to a function dynamically

在C ++中,包含任何和所有变量,包括基元。我知道很高的顺序,我完全期待悲观的答案。

4 个答案:

答案 0 :(得分:2)

你是对的。在运行时无法确定原语是否“设置”。有些编译器会警告您使用未初始化值的某些情况,但这一点都没有保证。

答案 1 :(得分:1)

我会使用可以为空的模板。见http://www.codeproject.com/KB/mcpp/CNullable.aspx

答案 2 :(得分:0)

假设你有

class Bob {
 int a;
 int b;
 double c;
 complex<double> d;
 Bob () : a(), b(), c(), d() {}
};

当您创建新Bob时,所有内容都将设置为默认值(在这种情况下为零)。

原始类型没有设置或未设置状态。他们总是有一些价值。

答案 3 :(得分:0)

如果你想用C ++重写Python,你可以。

您需要一个由字符串键控的高效unordered_map类。该字符串将是变量名。

每个变量值都是一个类(称为VARIANT,heh),它可以保存任何原始值。

然后,您将“struct”作为unordered_map又名dictionary的实例,而不是C ++结构。

如果在字典中找到变量名,则表示已设置,您可以返回该值。如果没有找到,则从未设置过。

如果您计划在C ++中按名称引用字典键,则需要使用以下内容来提高效率:

而不是:

VARIANT v = dict["name"];

使用:

static const std::string name_key("name");
VARIANT v = dict[name_key];

这样,每次进入函数时,不是为每次键查找构建一个包含“name”的std :: string,而是一次完成。