2009-05-19 15 views
0

を、私は疑問を持って、私はこれが可能であるかどうかを知りたい:ブーストの問題:: ptr_vectorとブースト:: [OK]を任意の

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

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

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

その後、私は、引数としてブーストを取り、別の雑多なクラス::いかなる*の関数に変更したいメンバーを渡しますany *を受け取り、以下を行います。

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

Enemy_Valuesはptr_vectorです。

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

そして、ここでは、私が違反エラーを取得:私はメンバーとしてEnemy_Valuesを持っている。このmisc_classにアクセスするときに、私は内部のauto_ptrはが指している先の値を変更したいです。私は多くのことを試しましたが、誰かがauto_ptrのコンテナを使用したり、boost :: anyで前後に変換したりしてはいけないということを教えてくれました。これは私が可能にしているのでしょうか、より良い、より直感的な方法がありますか?

ありがとうございます。

答えて

3

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

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

auto_ptrのご利用には、実際には間違っています:auto_ptrはfreestore上のオブジェクトが削除されますが、ここで私たちが代わりに地元の人々を扱っています。

Enemy_Values.push_back(val); 

...とEnemy_Valuesはただのstd ::ベクトルでなければなりません:addValuesは単にベクターにanyオブジェクトのをプッシュする必要があります。

これはptr_vectorオブジェクトとfreestoreによって割り当てられたboost::anyオブジェクトで行いますが、これは必要以上に複雑です。

0

auto_ptrはnumber of problemsです。既にboostを使用しているので、代わりにboost :: shared_ptrを使用してみませんか?