如何使用const属性赋值类?

时间:2016-01-11 14:36:02

标签: c++ oop const

我有一个简单的点类:

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; }; xy,因此我可以确定它们永远不会改变。他们应该永远不变。问题是我无法分配给持有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的任何变量吗?或者有解决方法吗?

3 个答案:

答案 0 :(得分:6)

这是不可能的。这需要修改const值。

不是自己xy const,而是将它们设为非const,而是提供const 接口它们,即将它们设为私有并提供const个吸气剂。

答案 1 :(得分:3)

而不是制作变量const,您可能无法通过以下方式为用户提供更改值:

  1. 将其设为私有
  2. 仅允许分配给另一个实例作为更改值的唯一方法。
  3. 您可以在以下示例中看到它的工作方式:

    #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
    }
    

    Live Example

    如果您取消评论最后两行,则会收到错误,以证明您无法更改xy

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

这当然是不推荐,但我不是认为知识有危险的人之一。