我想按照指定的顺序绘制形状。订购基于形状类,比如说,首先绘制所有三角形,然后绘制正方形。对于不同的形状组,顺序可能不同。
class Shape
{
public:
virtual void draw()=0;
};
class OrderedObject
{
static int id;
public:
virtual int getId();
};
class OrderedShape : public Shape, public OrderedObject
{
};
class Square : public OrderedShape
{
virtual void draw()
{
//draw itself;
}
};
class Triangle : public OrderedShape
{
virtual void draw()
{
//draw itself;
}
};
class OrderingFunctor
{
bool operator()(const OrderedShape * a, const OrderedShape * b)
{
if(m[a->getId()] < m[b->getId()])
return true;
return false;
}
map<int,int> m; //key, value pair. key = id, value = precedence order
};
void DrawAllShapes(const Set<OrderedShape*>& shapeSet, OrderingFunctor o)
{
Set<OrderedShape*, o> orderedShapes = shapeSet;
for(Iterator<Shape*> i(orderedShapes);i;i++)
(*i)->Draw();
}
我的问题是,
static int id
?OrderingFunctor
更好的订购方式?答案 0 :(得分:1)
(注意:您需要使用C ++ 11来执行此操作)
1)100%的时间不能说它更好,但std::type_index
效果很好,所以你可以这样做:
class Shape {
...
static std::type_index id;
};
Square::id = std::type_index(typeid(Square));
Triangle::id = std::type_index(typeid(Triangle));
... // etc.
通过这种方式,您可以轻松获得唯一ID,因为可以比较type_index并确保它们不同。
2)你可以使用lambdas:
std::vector<Shape*> shapes;
...
std::sort(shapes.begin(), shapes.end(),
[](const Shape* elem, const Shape* elem2) { // sort by z-order
return shape->getId() > shape2->getId();
});