2011-04-06 68 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); 
相关问题