2009-05-19 9 views
0

ok, donc je suis un doute, je veux savoir si cela est possible:Problèmes avec boost :: ptr_vector et boost :: tout

J'utilise une base de données, avec des données génériques (chaînes, ints, bools, etc ...). Chaque fois qu'un objet est construit ou qu'un membre d'un objet est modifié, je dois interroger la base de données avec l'action spécifique (SELECT ou UPDATE). Tout d'abord, ce n'est pas une question liée à la base de données, mon vrai problème est que j'ai un ptr_vector qui contient les pointeurs boost :: any vers les membres de l'objet. Dans le code comme ceci:

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

alors je passe les membres que je veux modifier une fonction d'une autre classe divers qui prend comme argument un coup de pouce :: * tout:

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

cette même classe accepte le any *, et fait ce qui suit:

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

Enemy_Values ​​est un vecteur ptr_vector. Alors, quand j'accéder à ce misc_class qui a Enemy_Values ​​en tant que membre, je souhaite modifier la valeur à laquelle un auto_ptr est à l'intérieur de pointe:

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

Et ici, je reçois une erreur de violation. J'ai essayé beaucoup de choses, et quelqu'un m'a dit que je ne devrais pas utiliser les conteneurs de auto_ptr ou convertir d'avant en arrière avec boost :: any. Est-ce que c'est ce que je suis en train de faire, ou y a-t-il une meilleure façon et plus intuitive?

Merci d'avance.

Répondre

3

(boost::any*)(ID_Enemy.get()) exécute un reinterpret_cast puisque vous lancez des types de pointeurs indépendants. Cela signifie que vous obtenez un pointeur non valide vers un any, pointant vers ce qui est réellement un entier. Au lieu de cela, construire un coup de pouce temporaire :: un objet et de le transmettre par référence à addValues:

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

Votre utilisation de auto_ptr est en fait incorrecte: auto_ptr supprime les objets sur le Freestore, mais ici nous avons affaire à la population locale à la place . addValues doit simplement pousser la valeur de l'objet any dans le vecteur:

Enemy_Values.push_back(val); 

... et Enemy_Values ​​devrait juste être un std :: vecteur.

Vous pourrait faire cela avec un ptr_vector et alloué Freestore-boost::any objets, mais ce serait plus compliqué que nécessaire.

0

auto_ptr a un number of problems. Puisque vous utilisez déjà boost, pourquoi ne pas utiliser boost :: shared_ptr à la place?