类成员函数返回另一个类:适用于获取类变量,但不适用于设置类变量

问题描述 投票:0回答:1

在更改 SubsidiaryClass 的变量成员时,似乎有一个隐含的 const 不允许使用 getSubsiaryClass() ,但它对于读取变量来说效果很好。 这不是一个公共/私人问题,我已经研究过了。 为什么第二种和第三种方法有效,而第一种方法不行?

任何人都可以帮助我理解为什么会发生这种情况吗? [或者告诉我在哪里可以找到答案,这是我的第一篇文章,我不确定协议]

#include <iostream>

class SubsidiaryClass {

    private:
        double                 little_double;

    public:
        double                 getLittleDouble()                                      {return little_double;}
        void                   putLittleDouble(double input)                          {little_double = input; return;}
};

class ParentClass {

    private:
        double                 little_double;
        SubsidiaryClass        subsidiary_class;
 
    public:
        double                 getLittleDouble()                                      {return little_double;}
        void                   putLittleDouble(double input)                          {little_double = input; return;}

        SubsidiaryClass        getSubsidiaryClass()                                   {return subsidiary_class;}
        SubsidiaryClass&       getSubsidiaryClassReference()                          {return subsidiary_class;}
        SubsidiaryClass*       getSubsidiaryClassPointer()                            {return &subsidiary_class;}

};

int main() {

    ParentClass parent_class;
  
    parent_class.getSubsidiaryClass().putLittleDouble(1.1);                                    // does not work, no error message 
    std::cout << parent_class.getSubsidiaryClass().getLittleDouble() << std::endl;

    parent_class.getSubsidiaryClassReference().putLittleDouble(2.2);                          // works fine
    std::cout << parent_class.getSubsidiaryClassReference().getLittleDouble() << std::endl;
    std::cout << parent_class.getSubsidiaryClass().getLittleDouble() << std::endl;

    parent_class.getSubsidiaryClassPointer() -> putLittleDouble(3.3);    // works fine
    std::cout << parent_class.getSubsidiaryClassPointer() -> getLittleDouble() << std::endl;    // works fine
    std::cout << parent_class.getSubsidiaryClass().getLittleDouble() << std::endl;

    return 0;

}
c++
1个回答
0
投票

在这一行中:

parent_class.getSubsidiaryClass().putLittleDouble(1.1);

getSubsidiaryClass()
返回一个
SubsidiaryClass
对象按值,因此它返回一个副本。 然后,您在该副本上调用
putLittleDouble()
,因此任何修改都不会反映在原始对象中。 这就是为什么这个表达式不报告新值的原因:

parent_class.getSubsidiaryClass().getLittleDouble()
© www.soinside.com 2019 - 2024. All rights reserved.