代码之家  ›  专栏  ›  技术社区  ›  Color Xenon

同一对象的链接方法

  •  0
  • Color Xenon  · 技术社区  · 8 年前

    我现在正在上课

    class Point{
    public:
        int x;
        int y;
        Point(int i , int j);
        Point incrementX();
        Point incrementY();
        void print();
    };
    Point::Point(int i, int j){
        x = i;
        y = j;
    }
    Point Point::incrementX(){
        x++;
        return(*this);
    }
    Point Point::incrementY(){
        y++;
        return(*this);
    }
    void Point::print(){
        cout << "(" << x << "," << y << ")" << endl;
    }
    
    void Q11(){
        Point a(2,3);
        //(3,4)
        a.incrementX().incrementY().print();
        //(3,3)why 33 here ??
        a.print();
    }
    

    我不明白为什么最后一个代码 a.print() 给出了 (3,3)

    我试着打印出 this 方法内部

    我打电话时找到了这两个地址 incrementX() incrementY()

    我猜是这样的 增量X() 访问类,但在调用时 增量() 班上有人。因此它在堆中复制类,然后 更改副本中的y。。。

    所以 (3,4) 以副本形式打印,并且 (3,3) 由实际类打印。。。

    2 回复  |  直到 8 年前
        1
  •  3
  •   James Dong    8 年前

    只有 a.incrementX() a.incrementX().incrementY() 增加临时实例化并丢弃。

    将点替换为 Point& 在里面 Point Point::incrementX()

        2
  •  2
  •   Paul Rooney    8 年前

    你的 incrementX incrementY 不同的实例

    如果删除复制构造函数,您可能会看到编译中出现错误。为此,添加

    Point(const Point&) = delete;
    

    delete . 如果年龄较大,请将其保密)

    因此,要诊断您的实际错误:

    1. 您构建 Point (2, 3) .
    2. 第一次呼叫 增量X 在原始实例上操作(现在是value (3,3)
    3. 递增 对临时副本进行操作,并将其值更新为(3,4)。它还返回一个副本。
    4. 打印具有预期结果(3,4)的第二个临时副本。
    5. 现在 a.print() 显示您的原件 指向 自从打电话给 增量X 显示(3,3)。

    为了利用您希望使用的链接,您的所有操作都应该在 对象,并通过非常量从这些函数返回 参考 .

    函数签名

    Point Point::incrementX()
    

    变成

    Point& Point::incrementX()
    

    完整的代码如下所示。

    #include <iostream>
    using namespace std;
    
    class Point{
    public:
        int x;
        int y;
        Point(int i , int j);
        //Point(const Point&) = delete;
        Point& incrementX();
        Point& incrementY();
        void print();
    };
    Point::Point(int i, int j){
        x = i;
        y = j;
    }
    Point& Point::incrementX(){
        x++;
        return(*this);
    }
    Point& Point::incrementY(){
        y++;
        return(*this);
    }
    void Point::print(){
        cout << "(" << x << "," << y << ")" << endl;
    }
    
    int main(){
        Point a(2,3);
        a.incrementX().incrementY().print();
        a.print();
    }
    

    使用删除的复制构造函数,这段代码可以很好地编译,因为没有发生复制。