从 setter 方法返回 *this 时,对象变得不可变

2024-03-29

我正在了解这个指针,它包含调用该函数的当前对象的地址。但是当我从成员函数返回当前对象时,我对这个指针有疑问。

#include<bits/stdc++.h>
using namespace std;
class Point
{
    private:
        int x,y;
    public:
        Point(int x,int y)
        {
            this->x = x;
            this->y = y;
            //cout<<this<<endl;                 
        }
        Point setX(int x)
        {
            this->x = x;
            //cout<<this<<endl;
            return *this;
        }
        
        Point setY(int y)
        {
            this->y = y;
            //cout<<this<<endl;
            return *this;
        }
        int getX()
        {
            return x;
        }                    
        int getY()
        {
            return y;
        }
};                                                           
int main()
{
    Point p(10,20);
    cout<<p.getX()<<" "<<p.getY()<<endl;
    p.setX(1000).setY(2000);
    cout<<p.getX()<<" "<<p.getY();
    return 0;
}

为什么 p.setX(1000).setY(2000) 只修改 x 的值,而不修改 y 的值? 为什么第二个cout语句的答案是1000 20但它应该是1000 2000?


原因是你的setX() and setY()方法返回一个Point- 他们返回一个copy你的对象。所以你的setY()设置y会员给你的临时副本点,不是原来的点。

您可以通过更改以下签名来纠正此问题:

Point setX(int x)

to:

Point& setX(int x)

类似地对于setY()。您会注意到返回类型现在是Point&- 参考Point object.

但请注意,您的类的 getter 和 setter 方法实际上允许处理x and y比如公共物品。因此,除非您计划用一些隐式的坐标表示来替换它们(例如,具有距原点的角度+距离),在这种情况下,setter 和 getter 会变得有趣 - 您还可以考虑将您的类简化为:

struct Point { int x, y; }

简单的设计往往是合适的。


最后,与您的具体问题无关,您的代码以一些不合适的行开头......

  • 为什么我不应该#include ? https://stackoverflow.com/q/31816095/1593077
  • 为什么是“using namespace std;”被认为是不好的做法? https://stackoverflow.com/q/1452721/1593077
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 setter 方法返回 *this 时,对象变得不可变 的相关文章

  • C++ 中的映射的多个键

    我有一个表 其中的条目是这样的 Row Column1 Column2 Column3 Column4 1 0X0A 1 2 A 2 0X0B 2 2 B 3 0x0C 3 2 C 现在我想使用映射 以便我可以使用第 1 列或第 2 列作为
  • Attachconsole的问题

    我需要使 Windows GUI 应用程序可以在控制台中运行 因此当使用命令行调用应用程序时 我将控制台附加到进程 但是 应用程序退出后 除非按 ENTER 键 否则不会显示带有路径的控制台提示符 有什么办法可以不按回车键直接显示路径提示吗
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • QT 5.6 QWebEngine不保存cookie

    我正在创建名为 webengine 的简单 QT 应用程序 pWebView new QWebEngineView this pWebView gt load QUrl http technoz ru pWebView gt show On
  • 在iOS中,在纯C中,这是获取本地文件路径的方法吗?

    我需要最终得到一个 cstring 作为捆绑包中文件的本地路径 First include
  • 用于更改可为空和非空数据类型的数据注释是什么?

    我认为这对于有经验的程序员来说应该很简单 但事实就是如此 我正在开发一个首先使用实体 框架代码的项目 我还启用了迁移并设置为自动 可爱的功能 我愚蠢地在我的实体类中声明了一种错误的数据类型 现在我意识到它不适用于我想要做的事情 一定是自动完
  • libcurl HTTP HEAD 请求没有自动代理连接标头

    我需要关于使用 libcurl 进行以下操作的说明 我需要发送如下所示的 http HEAD 请求 HEAD mshare 3 30002 12 primary stream xNKNVH mpeg HTTP 1 1 Host 192 16
  • 为了安全起见,在注销时禁用浏览器的后退按钮,例如 Yahoo、Gmail 等

    首先 我在 global asax 文件中将会话变量设置为 Session SessionId 如下所示 void Session Start object sender EventArgs e Code that runs when a
  • 获取DataGridView中特定列的值

    我的 Winforms 应用程序中有一个 datagridview 用户可以单击 datagridview 上的任意位置 然后单击按钮对该数据行执行操作 但是 为了做到这一点 我需要从该行恢复 ID 现在请记住 用户可能尚未单击 ID 列
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • 在下载的同时从 UnityWebRequest 获取数据?

    我有这段代码可以进行 REST 调用 public IEnumerator GetCooroutine string route string finalURL URL route UnityWebRequest www UnityWebR
  • 推导具有两个以上参数的 std::function

    我想知道为什么std function http en cppreference com w cpp utility functional function只知道有两个参数的函数 我已经编写了一些运行良好的代码 但存在许多限制 欢迎任何反馈
  • 提升精神带走关键字并忽略船长

    这是使用表达式的语法的一小部分 prefix lit L not gt gt prefix lit gt gt prefix postfix 我在 postfix 内部有某种方式纯名称获取标识符 name pure lexeme boost
  • C++ 抛硬币程序错误

    我正在尝试计算抛硬币中连续的正面朝上的次数 不幸的是 我的连续头计数器没有正确增加 有任何想法吗 代码和示例输出如下 include
  • 如何从函数调用事件处理程序?

    我有一个类 我从中调用一个函数ABC string st 带字符串参数 该函数定义在一个Form class Form1 我有一个列表视图 想要从函数中自动调用列表视图 mouse click 事件 我该如何做到这一点 您不能调用另一个类的
  • 在一个整数中找到另一个整数的 MSB 位置左侧的 N 个连续零位

    问题是 给定一个整数val1然后 给定第二个整数 找到最高位组 最高有效位 的位置val2找到第一个整数生成的位置左侧的未设置位的连续区域 width指定minimum必须在连续中找到的未设置位的数量 即width里面没有 0 这是我的解决
  • NullValueHandling.Ignore 使用 JsonConverter::WriteJson

    我正在尝试执行自定义序列化 所有快乐路径代码都可以工作 但空值路径的行为并不像我想要的那样 我已将序列化器设置设置为NullValueHandling Ignore我的对象图的其他部分为空 并且不使用我的自定义序列化 已删除空值 看起来 N
  • 以编程方式更改 Windows 服务用户

    我需要以编程方式更改 Windows 服务的登录用户 我使用以下代码来做到这一点 string objPath string Format Win32 Service Name 0 ServiceName using ManagementO
  • Eigen 如何沿特定维度连接矩阵?

    我有两个特征矩阵 我想将它们连接起来 就像在 matlab 中一样cat 0 A B eigen 有等价物吗 Thanks 您可以使用逗号初始值设定项语法 水平方向 MatrixXd C A rows A cols B cols C lt
  • 使用 winforms 、 mdi 、父子窗体,在父窗体下指定空间打开子窗体

    我有一个 winform MAINFORM 需要以此形式打开子窗体 如图所示 黑色部分是一个面板并且包含一个编号 具有多个节点的 LinkLabels 和 Treeview 在其余部分中 我想在单击面板上的链接标签时显示子表单 子表单应完全

随机推荐