2013-04-10 152 views
0
header1.h 

#define MaxNum 10 
#define MinNum 1 
//similar 100 other variables defined 

main.cpp 

#include header1.h 
main() 
{ 
    int size; 
    string first = "MaxNum"; //could be any of the variable name defined in header file 

    size = MaxNum ; 

我在頭文件中定義了某些變量。 主,根據「第一」的價值,我需要設置「大小」的值。這是否可行?根據其他變量設置變量

+0

'if(first == xxx){size = yyy; } else {size = zzz; }' – Arun 2013-04-10 19:36:53

+0

@ArunSaha他說有100個這樣的變量,我認爲他正在尋找比硬編碼100 else if語句更通用的解決方案。 – Barmar 2013-04-10 19:38:01

+0

@Barmar - 是的,這是正確的!我不想要其他語句 – dharag 2013-04-10 19:43:45

回答

3

我想你想擁有

size = MaxNum 

如果first == "MaxNum"

size = MinNum 

如果first == "MinNum"。如果first(可供選擇的變量集)的可能值集合很小,則只需將該分配放在if,else if系列語句中即可。最後,將一條else語句寫入一條錯誤消息。

但是,你必須硬編碼每一個案件:

if (first == "MaxNum") { 
    size = MaxNum; 
} 
else if (first == "MinNum") { 
    size = MinNum; 
} 
//... 

所以你的代碼的分配決定size隨着變量的數量增長較大。這被認爲是不好的風格,並且非常容易出錯不可維護

如果你不想這樣做,不要在你的程序中使用幾個變量,而是一個包含所有這些可能的鍵和它們的值的容器變量。它被稱爲關聯容器,在C++中有std::map類型,它實現了這樣的數據結構。

// Your container for the sizes (or whatever you want to call it) 
std::map<std::string, int> sizes; 
sizes["MinNum"] = 1; 
sizes["MaxNum"] = 100; 
// ... more values ... 

// Accessing this container with a variable as the key: 
size = sizes[first]; 

正如您所看到的,使用字符串變量作爲鍵訪問此容器非常容易。 sizes[first]只是簡單地給出容器中的值,該值等於變量first的當前內容的值。

有關C++(和C)源代碼的一個非常重要的事實是,在運行時您無法訪問變量的名稱。所以基本上,它們可以在不影響程序的情況下進行重命名。你想要的東西(查詢變量,枚舉,類,函數,它們的參數等)被稱爲自檢元編程,因爲你編寫的代碼在你的代碼上運行(「元代碼「)。

C++不提供默認的元編程功能(只有我知道的例外:typeid,但沒有用於變量名稱/定義)。默認情況下,你可以破解這個限制,並在構建過程中包含一些額外的步驟,這些步驟解析頭文件以獲取這些定義,並以不同的方式在運行時訪問它們。但地圖是更好的方式,相信我。

+0

很高興知道這個關於元編程。謝謝 !鍵值對似乎是可擴展的方法 – dharag 2013-04-10 19:57:12