2010-10-05 37 views
1

因此,比方说,在C++的一个类中,我有各种成员变量。结构,字符串,整数等可以是任何东西。这些变量可以或不能通过该类的对象的初始化来设置。给定int a,float b,char c,有时可以设置它们全部或全部不设置。当它们被设置时,它们可以被设置为任何可能的变量值。我想找到一些设置,并确定是否已设置变量没有:确定一个非对象变量是否在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++

,与任何及所有变量,包括原语。我知道的高位顺序,我完全期待着悲观的答案。

+1

你有使用这个构造函数的问题吗? – JoshD 2010-10-05 18:35:17

+0

你需要为这个项目使用C++吗?如果动态语言(或带反思的语言)更适合这个问题,最好的办法就是使用一种。 – nmichaels 2010-10-05 18:35:49

+0

如果您可以详细说明为什么要这样做,也许我们可以提供替代解决方案。 – JoshD 2010-10-05 18:45:47

回答

2

你是对的。在运行时确定基元是否“设置”是不可能的。一些编译器会警告你一些使用未初始化值的情况,但这并不能保证。

+0

...因为所有原语始终有*一些*值。他们*不*具有设置/非设置状态。实际上,一个类或结构的所有数据成员都有这个属性,但是如果你需要的话,你可以建立一个set-ness标志。 – dmckee 2010-10-05 20:27:33

+0

@dmckee,这就是“set”在引号中的原因。具体而言,未初始化的变量具有不确定的值(§8.5/ 11),并且不可能确定值是否不确定。 :) – 2010-10-06 02:52:21

0

假设你有

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

当你创建一个新的鲍勃,一切都将被设置(在这种情况下,零)为默认值。

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

0

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

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

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

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

如果在字典中找到变量名称,那么它已设置,您可以返回该值。如果没有找到,它从未设置。

如果计划通过名字从C到引用您的字典键++你将要使用的效率以下内容:

相反的:

VARIANT v = dict["name"]; 

用途:

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

通过这种方式,每次进入函数时都不会构建包含“name”的密钥查找的std :: string,它只会执行一次。

相关问题