如何在c ++中删除静态对象

时间:2014-11-30 07:41:08

标签: c++

我正试图在过剩中建立简单的画家(即点,线,圆等等)。每行必须有两个Point类型的点,因此每次用户输入鼠标左键时,都会执行所选命令。为了画一条线,我需要跟踪用户点击鼠标的次数,这就是我完成的工作

        if ( command == 1 ){ // drawing a line
            static int count(0); // track click no. 
            static std::vector<Point> p;
            //static Point startPoint(mouseX, mouseY);
            p.push_back(Point(mouseX, mouseY));

            if ( count == 1 ){
                Point endPoint(mouseX, mouseY);
                Point startPoint = p[0];
                shapes->addLine(Line(startPoint, endPoint));
                count = 0;
                p.clear();
            }else{
                count++;
            }

我只使用std::vector来使用clear(),这样我就可以删除startPoint,我需要它是静态的。我的问题是有没有办法通过vector使用更多的行来销毁一个对象?我试图调用析构函数但它没有帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用unique_ptr<Point>。然后,您可以使用reset设置或销毁Point

static std::unique_ptr<Point> startPoint;

if (startPoint){
  Point endPoint(mouseX, mouseY);
  shapes->addLine({*startPoint, endPoint});
  startPoint.reset();
} else {
  startPoint.reset(new Point(mouseX,  mouseY));
}

答案 1 :(得分:1)

你的代码很好。如果你担心行数,那么这是一个较短的版本:

if ( command == 1 ){ // drawing a line
    static std::vector<Point> p;
    p.push_back(Point(mouseX, mouseY));
    if (p.size() == 2){
        shapes->addLine(Line(p[0], p[1]));
        p.clear();
    }
}

但请注意,如果提高可读性,使用较少的行只是一件好事。相反,如果理解代码变得更难,那么这是一个坏主意。

大多数代码只写一次但是多次读取...在写入时节省时间并不是什么大问题。

在我认为这个特殊情况下,这个较短的版本更容易理解,但你的里程可能会有所不同。

答案 2 :(得分:1)

这是std::optional<Point>之类的事情之一。

但是关于破坏和重建部分,新的位置可以在这里有所帮助:

static int count(0);
// ('aligned_storage' requires C++11 and '#include <type_traits>')
static std::aligned_storage<sizeof(Point), alignof(Point)>::type startPointBuffer;
Point& startPoint = *static_cast<Point*>(static_cast<void*>(&startPointBuffer));
if (count == 1) {
    Point endPoint(mouseX, mouseY);
    shapes->addLine(Line(startPoint, endPoint));
    count = 0;
    startPoint.~Point();
} else {
    new (&startPoint) Point(mouseX, mouseY);
    count++;
}