我正试图在过剩中建立简单的画家(即点,线,圆等等)。每行必须有两个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
使用更多的行来销毁一个对象?我试图调用析构函数但它没有帮助。
答案 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++;
}