Я работал над проектом, который использует 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. У меня есть пара смутных мыслей (возможно, связанных с бустом), но я решил поискать другие мнения на случай, если что-то упущу ...