1

「一般的な」方法でメンバー属性を設定することは可能ですか? 私はまだ c++ に不慣れで、テンプレートに飛び込んだだけですが、これが正しい方法でしょうか?

私が使用しなければならないクラスには、informix データベースから入力される約 20 の文字列メンバーがあり、フィールド (= 属性) 名を持つ配列をループできます。

単純なクラスがあるとしましょう

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() );
}
4

3 に答える 3

2

メンバー データ ポインターを使用できます。これらは任意のタイプにすることができます-例えば

struct x {
    int y;
    int z;
};

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

ただし、実行時に識別子によるアクセスを開始する場合は、独自のシステムをゼロから構築する必要があります。

于 2011-02-14T16:13:50.843 に答える
1

私が考えることができる唯一のオプションは、属性をboost::anyのマップに格納することです。属性を異種タイプにすることを前提としています。

基本的な考え方は、Foo の属性をマップに置き換えることです。したがって、すべてのプライベート属性を持つ代わりに、それらをラップするマップを持つことになります。C++ の問題は、プログラムのコンパイル後に属性名が存在しないことです (Python などの他のスクリプト言語とは異なります)。したがって、ある種のデータ構造を使用せずに、名前を表す文字列から属性変数にアクセスする方法はありません

古い編集_を削除

于 2011-02-14T16:03:23.937 に答える
0

std::map を使用できます。'ki' の (基本) クラスは、次のように setattribute を実装する必要があります。

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

void MyClass::setattribute( const char * name, const char * value )
{
  mProps[name] = value;
} 
于 2011-02-14T16:05:38.960 に答える