Получение указателей из вектора - PullRequest
0 голосов
/ 17 января 2012

Я работал над проектом, который использует API на основе графов. Мне нужно иметь возможность просматривать график и помещать указатели на существующие узлы в список (в данном случае, std :: vector).

Конечно, как только я закончу обход графа, я хочу взять эти указатели и назначить их переменным-членам класса. Проблема, конечно же, заключается в попытке скопировать указатели из вектора на переменные класса. Проблема возникает из-за необходимости сохранять узлы в векторе, приведенном как указатели на базовый класс, а затем приводить их обратно к их фактическому типу при передаче в переменные-члены класса.

Грубо говоря, я хочу сделать следующее:

std::vector<smart_pointer<node_base> > nodes;
nodes.push_back( node ); 
//"node" is a smart pointer of a derived type from node_base

for ( ... )
{
    MyClass::member_node_ref = static_cast<node_type>( ( *vector_node_iterator ));
    //member_node_ref is a smart pointer of the derived node type
    //vector_node_iterator is an iterator of the vector<node_base> object
}

Все это прекрасно работает, пока мой конструктор копирования не завершится. Когда это происходит, ссылки на указатели уничтожаются.

Это согласуется с тем, что я понимаю о векторах указателей, поэтому я не удивлен поведением, хотя я надеялся, что вектор объектов smart_pointer будет работать вокруг него. В конце концов, я не могу понять, как избежать указателя static_cast, который, как я знаю, является моим уничтожением здесь. То есть у меня есть несколько производных типов, которые я передаю, поэтому я не могу уйти от static_cast. У меня есть пара смутных мыслей (возможно, связанных с бустом), но я решил поискать другие мнения на случай, если что-то упущу ...

...