实现链接方法时打印的值错误

问题描述 投票:3回答:3

给我一个特定的主要内容

int main() {

  Widget w;

  w.set(3).print().set(2).print();

  w.print();
}

我需要编写一个类Widget,以便程序打印3,2,2。

我最好的尝试是打印令人失望的3,2,3:/

class Widget{
public:
  Widget(){m_i =0;};

  Widget(int i){m_i =i;};

  Widget set(int i){
    this->m_i = i;
    return *this;
    };

  Widget print(){
    std::cout<<this->m_i<<std::endl;
    return *this;
    };
  int m_i;
};

int main() {

  Widget w;

  w.set(3).print().set(2).print();

  w.print();
}

关于如何解决这个问题的任何想法?感谢所有愿意提供建议的人:)

c++ named-parameters
3个回答
3
投票

您缺少的是从您的函数返回的对象需要作为参考,例如一个Widget&,而不是Widget。目前,您从每个set()或print()调用返回一个全新的副本,这意味着对该对象的任何进一步更改都不会应用于原始w对象。


1
投票

发生这种情况是因为在第一次调用w之后你保持原来的set不变。

我发生的原因是你在每次操作的每次返回时复制w

Widget set(int i){
    this->m_i = i;
    return *this; // Copy, return type is a `Widget` value
}

您应该通过引用返回:

//    v--- There
Widget& set(int i){
    this->m_i = i;
    return *this; // No copy, return type is a `Widget` reference
}

不复制widget变量将导致w变异而不是临时副本。


0
投票

事情是这样的:setprint都应该通过引用返回*this。添加(用Widget替换Widget&)和其他一些小修复可以解决这个问题:

#include <iostream>

class Widget{
public:
  Widget(int m) // Initialization over assignment
  : m_i(m)
  { }

  Widget()      // Initialization over assignment
  : m_i(0)
  { }

  Widget& set(int i) // return a reference 
  {
    m_i = i;         // this-> is not recommended
    return *this;
  };

  Widget& print()    // return a reference 
  {
    std::cout<< m_i << std::endl; // this-> is not recommended
    return *this;
  };

private: // data members are usually private
  int m_i;
};

int main() {

  Widget w;
  w.set(3).print().set(2).print().print();

  return 0;
}

但实际上你会将print声明为const函数,因为能够打印const对象是有意义的

© www.soinside.com 2019 - 2024. All rights reserved.