按指定顺序绘制形状

时间:2015-12-08 05:32:42

标签: c++ oop

我想按照指定的顺序绘制形状。订购基于形状类,比如说,首先绘制所有三角形,然后绘制正方形。对于不同的形状组,顺序可能不同。

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();

}

我的问题是,

  1. 有没有更好的方法来识别类别而不是static int id
  2. 有没有比使用OrderingFunctor更好的订购方式?

1 个答案:

答案 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();
});