2011-02-14 51 views
0

是否有可能在一个“通用”的方法来设置一个成员属性? 我还是新的C++和刚刚跳入模板,如果这是要走的路?设置成员属性在“通用”的方式

I类必须使用具有大约20线绳构件被从Informix数据库填充,我可以通过与字段(=属性)名称的数组循环。

比方说,我有一个简单的类

class Foo 
{ 
    public: 
    attr1 
    attr2 
    Foo() { }; 
    ~Foo(); 
} 

,我可以用它这样的:

Foo foo; 

string myattr = "attr1"; 
string myval = "val x1"; 
string myval = "val x2"; 

setattribute(foo, myattr, myval1); // pseudocode... possible somehow? 
cout << foo.attr1;  // prints "val x1" 

setattribute(foo, myattr, myval2); // pseudocode... possible somehow? 
cout << foo.attr1;  // prints "val x2" 

的方法我在循环调用看起来是这样的......

// its_ref : empty string reference 
// row: ptr on the current db row = query result object 
// colname: the db column = attribute 
// ki: the object 

void get_fd(ITString & its_ref, ITRow * row, ITString colname, ns4__SOAPKunde& ki) { 
     ITConversions *c; 
     ITValue *v = row->Column(colname); 
     v->QueryInterface(ITConversionsIID, (void **) &c); 
     c->ConvertTo(its_ref); 
     // here is the place i want to use it : 
     setattribute(ki, colname, its_ref.Data()); 
} 
+1

你可以做到这一点。你只需要一个代码生成器来为你生成反射。 – 2011-02-14 18:11:21

回答

2

就可以使用会员数据指针。这些可以是任何类型 - 例如

struct x { 
    int y; 
    int z; 
}; 

int main() { 
    int x::* res = &x::y; 
} 

但是,如果你想开始在运行时由标识符访问它们,你将不得不从头开始构建自己的系统。

1

我能想到的唯一选择是保存您在地图上boost::any属性。假设您希望您的属性具有不同类型的属性。

的基本思想是地图替换美孚你的属性。因此,您不必拥有所有私有属性,而只需要一张包裹它们的地图。 C++的问题在于编译程序后,你的属性名称不存在(不像其他脚本语言,如python)。因此,有没有办法从代表它的名称的字符串访问属性变量,而无需使用某种数据结构的

去除老编辑 _

+0

我已阅读过,很好。但是你不想改变SOAPKunde类的实现,意味着ki对象?我对此没有影响。或者我弄错了吗? – groovehunter 2011-02-14 16:25:12

0

你可以使用一个std ::地图。 的(基地)类的“棋”,那么必须实现这样的setAttribute:

// Member variable of MyClass 
std::map<string, string> mProps; 

void MyClass::setattribute(const char * name, const char * value) 
{ 
    mProps[name] = value; 
} 
+0

这不是他所谈论的。 – Nawaz 2011-02-14 16:08:44

+0

@Nawaz:为什么这么肯定?我觉得他是很新的C++,并告诉很模糊,他想要什么(例如潜入模板,富=美孚(); ???)。你确切知道吗? – 2011-02-14 16:36:14

相关问题