【问题标题】:*this (Return reference to the calling object) does not return changed object's value in that function*this(返回对调用对象的引用)不返回该函数中已更改对象的值
【发布时间】:2021-07-09 13:53:36
【问题描述】:

假设有两个对象:num1、num2,每一个都存放整数5。

我想使用非成员函数添加两个对象的值,所以结果是:10。

但输出显示值:5。

类成员函数或*this指针有错误吗?

main.cpp

#include<iostream>
#include"Person.h"  
using namespace std ;

int main(){
    Person num1 ;
    Person num2 ;

    num1.InValueCapture(5) ;
    num2.InValueCapture(5) ;

    add(num1,num2);   //non class member function  : num1+num2 expecting result : 10           
    
    cout << "THE OUTPUT : " << num1.GetValueCapture() << endl; //but now we get 5 
    return 0 ;
}

人.h

#ifndef PERSON.H
#define PERSON.H

struct Person{
private:
    int value_capture ;
public:

    int InValueCapture(int value){
        value_capture = value ;
    }

    int GetValueCapture() const {
        return value_capture ;
    }

    //adding two data
    Person& combine(const Person &Rdata)
    {
        value_capture += Rdata.value_capture ;
        std::cout << "value capture : " << value_capture <<std::endl; // use to check value inside DataSum.value_capture

        return *this ;
    }
};



Person add(const Person &Ldata , const Person &Rdata)       //nonmember function 
{
    Person DataSum = Ldata;
    DataSum.combine(Rdata);  // add Rdata to Ldata , call class function combine
    return DataSum ;        //
}

#endif

感谢您的指导,感谢您的帮助。

【问题讨论】:

  • 您的 add 函数正在修改并返回您在其中创建的 DataSum 对象。如果要查看应用于传递给函数的对象的更改,则需要修改 LDataRData
  • 同样的情况:int add(const int&amp; a, const int&amp; b) { int sum = a; sum += b; return sum; }。你看到问题了吗?

标签: c++ return this-pointer


【解决方案1】:

评论都是骗子:

DataSum.combine(Rdata);  // add Rdata to Ldata , call class function combine

这不会“将 Rdata 添加到 Ldata”。您正在调用DataSum 的方法,它是LData 的副本。修改副本对原LData没有影响。不要复制:

void add(Person &Ldata , const Person &Rdata)       //nonmember function 
{
    Ldata.combine(Rdata);  // add Rdata to Ldata , call class function combine
}

实际上,我不是 100% 确定该函数应该做什么。如果要修改第一个参数,则不能将其作为const 引用传递。如果您不想通过const 引用修改它,那么您可以返回结果,但这已经是您的函数所做的,只是您忽略返回的值。我删除了 return 以更清楚地表明该函数修改了它的第一个参数。不过,现在调用者也可以直接调用combine

【讨论】:

  • 这行不通,因为combine 是正确的非const 成员函数,所以如果Ldataconst Person&amp;,则不能调用它。实际的问题是他们似乎期望 add 改变它的参数,而不是使用他们写的返回值。
  • @NathanPierson 意识到这一点并删除了const。现在我不确定它是否应该返回参考或副本......
  • 如果它真的应该改变它的左手边,我看不出有什么明显的理由让它返回任何东西。但是我不明白你为什么要编写一个非成员 add 函数来改变它的左侧而不是 operator+= 或其他东西。
  • @NathanPierson 我想这只是在练习和尝试不同事物时遇到的“问题”。直接调用combine,free函数就没什么用了
  • 谢谢,问题通过删除 const 解决。
【解决方案2】:

改变

Person add(const Person &Ldata , const Person &Rdata)

[[nodiscard]] Person add(const Person &Ldata , const Person &Rdata)

add 是一个“纯”函数,因为它返回 L 和 R 之和。

它也不修改。

一旦你这样做:

add(num1,num2);   //non class member function  : num1+num2 expecting result : 10           

这会导致编译器错误,因为您正在执行相当于x+y 然后丢弃结果。

num1 = add(num1, num2);

做你想做的。

名为add 的函数应该修改其参数。

您可能应该接受运营。将combine 更改为:

//adding two data
Person& operator+=(const Person &Rdata)&
{
    value_capture += Rdata.value_capture ;
    std::cout << "value capture : " << value_capture <<std::endl; // use to check value inside DataSum.value_capture

    return *this ;
}

add 到:

// notice we take Ldata **by value**, making a copy
[[nodiscard]] Person operator+(Person Ldata, const Person &Rdata)  {
  Ldata += Rdata;
  return Ldata;
}

您的main 代码将变为:

num1 = num1+num2;

num1 += num2;

两者都非常清楚他们应该做什么。

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2011-02-25
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多