Проблемы с boost :: ptr_vector и boost :: any - PullRequest
0 голосов
/ 19 мая 2009

хорошо, у меня есть сомнения, я хочу знать, возможно ли это:

Я использую базу данных с общими данными (строки, целые числа, bools и т. Д.). Всякий раз, когда объект создается или член объекта изменяется, я должен запросить базу данных с определенным действием (SELECT или UPDATE). Во-первых, это не вопрос, связанный с БД, моя настоящая проблема в том, что у меня есть ptr_vector, который содержит указатели boost :: any для членов объекта. В коде что-то вроде этого:

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. Поэтому, когда я получаю доступ к этому misc_class, в котором Enemy_Values ​​является членом, я хочу изменить значение, на которое указывает auto_ptr внутри:

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

И здесь я получаю ошибку нарушения. Я пробовал много вещей, и кто-то сказал мне, что я не должен использовать контейнеры auto_ptr или конвертировать туда и обратно с boost :: any. Это то, что я делаю, возможно, или есть лучший и более интуитивный способ?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 19 мая 2009

(boost::any*)(ID_Enemy.get()) выполняет reinterpret_cast, поскольку вы приводите несвязанные типы указателей. Это означает, что вы получите неверный указатель на 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 и boost::any, выделенными для freestore, но это будет сложнее, чем необходимо.

0 голосов
/ 19 мая 2009

auto_ptr имеет количество проблем . Поскольку вы уже используете boost, почему бы не использовать вместо него boost :: shared_ptr?

...