我刚刚开始学习c ++,需要帮助来了解这些类和函数之间的情况。如果classA有一个classB,那么如果我为B类使用了setter,则直到A类,它都没有改变。
如果我直接使用classB setter,它可以正常工作。我还发现,如果我使用指针,可以使函数正常工作,但是我想了解为什么它不起作用。
#include <iostream>
ClassA
{
private:
ClassB test;
public:
ClassB getTest(){return test;}
};
ClassB
{
private:
int a = 10;
public:
int getA(){return a;}
void setA(int b){a += b;}
};
int main()
{
ClassA myClass;
myClass.getTest().setA(20);
std::cout << myClass.getTest().getA(); // Will return 10 still
}
我认为这会将int in test修改为30,但不会,并且int仍为10。
答案 0 :(得分:2)
ClassB getTest(){return test;}
这将返回test
的副本。您修改副本,而不是成员test
本身。因此,稍后您发现test
中没有变化。
要允许用户修改它,您需要通过引用返回:
ClassB& getTest(){return test;}
答案 1 :(得分:0)
好的,您会喜欢上它的。 C ++不是Java。您在ClassA上的访问方法返回的是ClassB对象的COPY,而不是对其的某种引用。这是一个完全不同的ClassB对象,因此,如果您摆弄它,就不会再爱A中的对象了。
您需要使用如下访问方法:
ClassB & getTest(){return test;}
请注意,&表示“参考”。这是一个指针,但是您可以使用点表示法而不是箭头表示法。
之后,您编写的代码应该可以工作。但是请注意,如果您调用myClass.getTest()然后进行操作,它将看起来像:
ClassB & myClassB = myClass.getTest();
myClassB.setA(20);
现在,作为警告,此代码将编译:
ClassB myClassB = myClass.getTest();
myClassB.setA(20);
这段代码说的是:“ myClass-给我一个对您的ClassB对象的引用。但是,我接下来将构造一个新的ClassB对象并将其复制到其中。”换句话说,它的工作方式与getTest()不返回引用相同。