2013-05-31 52 views
0

我需要評估的字符串,所以我可以一個值分配給一個類變量:評估字符串類變量

類別:

class DATACLASS { 
public: 
    double variable1, variable2, variable3; 
}; 

空隙的init():

void init() 
{ 
    DATACLASS *d = new DATACLASS; 
    std::string ssList[3] = {"variable1", 
          "variable2", 
          "variable3"};       
    for(unsigned i = 0; i < 3; ++i) 
    { 
     std::stringstream ss; 
     ss << ssList[i]; 
     //ss.str().c_str() correspond to "variable1", "variable2", "variable3" 
     mxArray *array_ptr = mexGetVariable("base", ss.str().c_str()); 
     double pr = (double)mxGetPr(array_ptr)[0]; 
     // How to make the same thing here? 
     // I would like to have something that would evaluate 
     // data->ssList[i] = pr; 
     // or more precisely  
     // data->variable1 = pr; 
     // but from the ss string like below (but this doesn't work) 
     data->ss.str().c_str() = pr; 
    } 

我試圖這樣做時遇到這種錯誤:

error C2039: 'ss' : is not a member of 'DATACLASS' 
+0

這稱爲*反射*,如果你想谷歌它。簡短的回答:你不能在C++中做到這一點。使用其他語言,或查看您的設計。 –

+0

在C++中沒有像JavaScript一樣的內置支持。有些人試圖構建你可以使用的反射框架,但我從來沒有測試過。如果你真的想要這樣的事情,你必須自己假裝。 – jerry

+0

@AlexandreC。很高興知道我想要做的是什麼。我真的不知道該找什麼。看來我必須審查我的設計。 –

回答

0

這是無效的C++。編譯器認爲你試圖做的是訪問名爲ssDATACLASS實例的成員,並調用它的一些方法。

你想要做的事情可以用反射來完成,這在C++中是不支持的。您可以通過使用某種形式的使用模板的僞反射模型來完成它。

+0

你有任何僞反射代碼的例子嗎? –

+0

如果你知道所有的字段都是相同的類型,然後用'ss.str()'索引它,它可能就像有一個映射(鍵值對列表)一樣簡單。我建議你不要試圖使用模板魔法或其他僞反射的兔子洞,除非你對C++能力相當有信心。 –

0

最合理的就是沒有大量的努力就像下面這樣。你可以使用宏,函數,容器,模板,指針/引用等抽象出一些東西,但這是基本的要點。除非你有一個令人信服的理由,否則我不會建議這樣做並且花時間去做。你最終的目標是什麼?

class DATACLASS { 
public: 
    double variable1, variable2, variable3; 
}; 

void init() 
{ 
    DATACLASS *d = new DATACLASS; 
    std::string ssList[3] = {"variable1", 
          "variable2", 
          "variable3"};       
    for(unsigned i = 0; i < 3; ++i) 
    { 
     std::stringstream ss; 
     ss << ssList[i]; 
     //ss.str().c_str() correspond to "variable1", "variable2", "variable3" 
     mxArray *array_ptr = mexGetVariable("base", ss.str().c_str()); 
     double pr = (double)mxGetPr(array_ptr)[0]; 
     if(ss.str() == "variable1") 
     data->variable1 = pr; 
     else if(ss.str() == "variable2") 
     data->variable2 = pr; 
     else if(ss.str() == "variable3") 
     data->variable3 = pr; 
    } 
} 
+0

這就是在添加for循環之前編碼的方式。因爲可能有大量的變量,我試圖避免使用if if if。 –

+0

@m_power我不明白。那麼讓我看看我能否爲你提供別的東西。如果這些值始終是編譯時常量,那麼它會更容易一些,但那麼這將是一個不太有趣的問題:) – jerry

+0

@m_power您是否試圖避免由於運行時問題(速度,代碼大小)或開發引起的if語句擔心(重複鍵入的數量,錯誤的風險,可維護性的噩夢)? – jerry

0

你只會讀雙打嗎?你可以使用指向數據成員的指針。

std::map<std::string, double DATACLASS::*> aMembers; 
    aMembers["variable1"] = &DATACLASS::variable1; 
    aMembers["variable2"] = &DATACLASS::variable2; 
    aMembers["variable3"] = &DATACLASS::variable3; 

    DATACLASS dc; 
    std::string sData = "variable1"; 
    dc.*aMembers[sData] = 10; 

在完整的解決方案中,您當然必須先檢查aMembers [sData]是否存在。如果您需要支持多種數據類型,則需要使用模板並編寫一些支持類。但它應該是可行的。