我有一个简单的点类:
dependency
值class Point {
public:
Point(const double, const double);
/** This constructor creates invalid point instance **/
Point();
~Point();
const double x;
const double y;
/** This returns true if one of the values is NaN **/
bool isInvalid() const;
/** Returns true if coordinates are equal **/
bool equal(const Point& p) const;
};
和x
为y
,因此我可以确定它们永远不会改变。他们应该永远不变。问题是我无法分配给持有const
的变量:
Point
我理解分配是一个问题,因为Point somePoint;
... meanwhile, things happen ...
//ERROR: use of deleted function 'Point& Point::operator=(const Point&)'
somePoint = Point(x, y);
是被禁止的。我需要在渲染过程中使用point来保持最后一个点值:
somePoint.x = something
类属性中的Point lastPoint;
PointInGraph* point = graphValues.last;
while((point = point->next())!=nullptr) {
// calculate pixel positions for point
double x,y;
...
if(!lastPoint.isInvalid())
drawer.drawLine(round(lastPoint.x), round(lastPoint.y), round(x), round(y));
// ERROR: use of deleted function 'Point& Point::operator=(const Point&)'
lastPoint = Point(x, y);
}
也可以简单地创建该类const
的任何变量吗?或者有解决方法吗?
答案 0 :(得分:6)
这是不可能的。这需要修改const
值。
不是自己x
和y
const
,而是将它们设为非const
,而是提供const
接口它们,即将它们设为私有并提供const
个吸气剂。
答案 1 :(得分:3)
而不是制作变量const
,您可能无法通过以下方式为用户提供更改值:
您可以在以下示例中看到它的工作方式:
#include <iostream>
class Point {
public:
Point(const double x_ = 0, const double y_ = 0) : x(x_), y(y_) {}
double getX() const { return x; }
double getY() const { return y; }
private:
double x;
double y;
};
int main()
{
Point a{1,5};
Point p;
p = a;
std::cout << p.getX() << ", " << p.getY(); // no error here
//p.x = 5; // error here now
//p.y = 7; // error here now
}
如果您取消评论最后两行,则会收到错误,以证明您无法更改x
和y
。
答案 2 :(得分:-3)
实际上,当然,这可能是通过名为抛弃常数的直接技术实现的,这是一种已知的loophole in const
mechanic in C++。基本上我可以滥用const int*
可以分配给int*
变量的事实。可能的解决方案:
Point& Point::operator=(const Point& p)
{
*((double*)&x)=p.x;
*((double*)&y)=p.y;
}
这当然是不推荐,但我不是认为知识有危险的人之一。