2011-04-06 67 views
0
訪問成員名稱

請考慮這個類:是否有可能從參數

class A 
{ 
public:  //public in this example 
    string a1; 
    string a2; 
    string a3; 
    string a4; 
    int a5; 
    double a6; 
    (...) plus other 50 member names 

    multiset<string> getAttrib(const vector(A)& va, string attr) 
    { 
    for (vector<string>::const_iterator ci = va.begin; ci != va.end(); ++ci) { 
     cout << ci->attr << endl;  //ERROR 
    } 
}; 

成員函數可以調用,如:

A a 
a.getAttrib(vector_a, "a1"); 

這將導致一個錯誤。 Const class A has no member named 'attr'.

我不想寫50個不同的case陳述來達到上述想要的靈活性。 它可能以某種方式? 如果成員名稱是私人的,可以使用公共成員函數來執行此操作嗎?

除了class A,我有六個其他類似的類,並希望有一個父類,將採取七個類中的任何一個向量,並可以返回所選成員名的值(或實際情況下multiset)。

+1

非常相似,[我怎麼可以使用動態方法在C++](HTTP://計算器.COM /問題/ 1463515 /何燦我用動態的方法,在-C)。 – 2011-04-06 15:38:51

+0

您似乎已經注意到Python或其他語言,其中成員只是字典鍵。在C++中情況並非如此。無法通過編譯時未知的名稱訪問成員。 – 2011-04-06 15:40:07

+0

@Alexander Gessler:是的,Python和Php有過以前的經驗。 – Luis 2011-04-06 16:10:11

回答

4

雖然在反射框架中有一些合理的嘗試,但在C++中沒有直接的方法來做你想要的。你也可以看看這裏:How can I add reflection to a C++ application?關於反射的額外評論。然而,我建議您不要使用50個成員變量,而只需使用一個私鑰std::hashmap並使用std::string密鑰。然後,您可以輕鬆地將字符串參數作爲鍵直接查找。

這當然假設你所有的50個成員都屬於同一類型,並且可能不適合你的應用。不過,請記住我的觀點,即:做一點不同的事情。

+0

每個類別的+50個成員名稱(不同類型)匹配每個表中的+50個字段。一個表=一個類,一個字段=一個成員名。我想我必須以不同的方式做。考慮到這一點,你認爲hashmap最適合這項工作嗎? – Luis 2011-04-07 09:11:49

+0

@Luis,如果不知道問題的更廣泛背景和解決方案,很難說。這聽起來像你的類是事務性數據庫操作的傳遞,或者可能是表的易變易變表示。或者也許你正在編寫一個ORM。我不知道。 'std :: hashmap'可以是任何一種非常合適的數據結構。這取決於你在做什麼以及爲什麼。另一方面,你可能會重新發明輪子,應該使用ODBC或OLE或http://stackoverflow.com/questions/74141/good-orm-for-c-solutions或類似的東西。 – 2011-04-07 17:40:14

2

您可以使用X macro技術將變量映射到包含您的a_n的容器索引(例如std::deque)。您應該在最後添加一個額外的條目,以便獲取所需的容器大小。

0

這聽起來像你可能想要一個指向成員的指針,儘管可能更好地更改爲更靈活的對象表示形式,例如區分聯合數組(boost::variant)或C++ 11 std::tuple

無論如何,與指針到成員,你可以有

template< typename Attr_Type > 
    static vector<Attr_Type> getAttrib(const vector<A>& va, Attr_Type A:: *attr) 
    { 
    vector<Attr_Type> ret; 
    for (vector<A>::const_iterator ci = va.begin(); ci != va.end(); ++ci) { 
     cout << ci->*attr << endl; 
     ret.push_back(ci->*attr); 
    } 
    return ret; 
    } 

用作

vector<A> vector_a; 
vector<string> vector_a_a1 = A::getAttrib(vector_a, &A::a1); 
相關問題