вот классы, о которых мой вопрос
class Graph {}
class SceneGraph : public Graph {}
class Node {
public:
virtual Node* getNode(int index) { return mNodeList[index]; }
protected:
vector<Node*> mNodeList;
Graph* mGraph;
}
class TransformationNode : public Node {
public:
TransformationNode* getNode(int index) { return static_cast<TransformationNode*> (mNodelist[index]); }
void _update() {
auto beg = mNodeList.begin();
auto end = mNodeList.end();
while (begin != end) {
TransformationNode* node = static_cast<TransformationNode*> (*beg);
node->_update();
}
}
private:
bool mUpdated;
SceneGraph* mGraph;
}
Прежде всего, я хочу рассказать о проблемах, которые я решил. Они могут помочь другим. И вы можете подтвердить меня, если я прав ^^
- #P3#
#P4#
- #P5#
#P6#
И есть проблема, которую я действительно хочу как-то обойти.
В классе TransformationNode я сделал много (ИМХО) приведения типов, которых можно избежать, из базового класса в производный. Я точно знаю, что все элементы в векторе mNodeList являются TransformationNodes, но для обработки mNodeList мне нужно привести их тип.
Наследование правильное. Я имею в виду, что TransformationNode является узлом
mNodeList содержит дочерние узлы узла и не может иметь копию в производном классе, который содержит приведенную версию узлов
< br> И, наконец, я могу даже использовать reinterpered_cast, если static_cast дороже. Можете ли вы сообщить мне стоимость этих операций? они действительно большие проблемы с производительностью?
assert (dynamic_cast)... меры предосторожности уже приняты.
Вкратце, я хочу, чтобы мой компилятор знал, что mGraph на самом деле является SceneGraph*, а mNodeList содержит TransformationNode*, это помогает мне избежать потери приведения типов.
Спасибо, что уделили время
mNodeList
из базового класса в производные классы. Это дает вам ту же функциональность без приведения - person Seth Carnegie   schedule 15.01.2012Node
содержит список еще... узлов. Я думаю, что редизайн решит большинство проблем здесь. - person Kerrek SB   schedule 15.01.2012