2010-10-05 91 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,它只會執行一次。

相關問題