0

わかりましたので、疑問があります。これが可能かどうか知りたいです。

一般的なデータ(文字列、整数、ブール値など)を含むデータベースを使用しています。オブジェクトが構築されるか、オブジェクトのメンバーが変更されるたびに、特定のアクション (SELECT または UPDATE) を使用してデータベースにクエリを実行する必要があります。まず第一に、これは DB 関連の質問ではありません。私の本当の問題は、オブジェクトのメンバーへの boost::any のポインタを保持する ptr_vector があることです。次のようなコードで:

class Enemy{
  private:
    //some private data...
  public:
    auto_ptr<int> ID_Enemy;
    auto_ptr<string> Enemy_Name;
    //miscellaneous methods...
};

次に、変更したいメンバーを、引数として boost::any* を取る別のその他のクラスの関数に渡します。

misc_class.addValues((boost::any*)(ID_Enemy.get()));
misc_class.addValues((boost::any*)(Enemy_Name.get()));

その同じクラスは any* を受け入れ、次のことを行います。

auto_ptr<boost::any> val2(val); //being val, the passed any*
Enemy_Values.push_back(val2);

Enemy_Values は ptr_vector です。したがって、Enemy_Values をメンバーとして持つこの misc_class にアクセスするとき、内部の auto_ptr が指している値を変更したいと考えています。

misc_class.Enemy_Values[0] = (boost::any)(69);

ここで、違反エラーが発生します。私は多くのことを試しましたが、auto_ptr のコンテナーを使用したり、boost::any で前後に変換したりするべきではないと誰かに言われました。これは可能ですか、それとももっと直感的な方法がありますか?

前もって感謝します。

4

2 に答える 2

3

(boost::any*)(ID_Enemy.get())reinterpret_cast無関係なポインター型をキャストしているため、 a を実行します。anyこれは、実際には整数を指しているへの無効なポインタを取得することを意味します。代わりに、一時的な boost::any オブジェクトを作成し、参照によって addValues に渡します。

misc_class.addValues(boost::any(ID_Enemy.get());

の使用はauto_ptr実際には正しくありませauto_ptrん。フリーストアのオブジェクトを削除しますが、ここでは代わりにローカルを扱っています。オブジェクトのをベクターaddValuesにプッシュするだけです。any

Enemy_Values.push_back(val);

...そして、Enemy_Values は std::vector にする必要があります。

これは、ptr_vector と freestore で割り当てられたオブジェクトを使用して実行できますboost::anyが、必要以上に複雑になります。

于 2009-05-19T01:01:04.973 に答える
0

auto_ptrにはいくつかの問題があります。すでにboostを使用しているので、代わりにboost :: shared_ptrを使用してみませんか?

于 2009-05-19T01:07:10.873 に答える