C++ 在c+;中设置较低层次私有字段的最佳实践+;

C++ 在c+;中设置较低层次私有字段的最佳实践+;,c++,oop,C++,Oop,我必须上以下课程: //file: A.h class A { private: int num; public: A(int num); void setNum(int num); int getNum(); }; //file B.h class B { private: A a; public: B(int num); A getA();

我必须上以下课程:

//file: A.h
class A
{
    private:
       int num;
    public:
       A(int num);
       void setNum(int num);
       int getNum();       
};

//file B.h
class B
{
    private:
       A a;
    public:
       B(int num);   
       A getA();
};
类A包含在类B中。类A有一个私有字段“num”。类具有私有字段“num”的公共getter和setter。在类B中构造对象时,它将“num”的值转发给它包含的对象A

在创建对象B(因此也包括包含的对象A)之后,将A.num的值设置为与B上下文不同的值的最佳实践是什么

例如,这似乎不起作用:

// file main.cc
int main()
{ 
    B b(5);
    B.getA().setNum(7);
}

谢谢,

在B中定义一个成员函数来设置a的值:

void B::setA(int k) {
    a.setNum(k);
}

As@πάνταῥεῖ 注释后,getter
A getA()
返回一个临时对象,该对象在超出
getA()的范围时将被销毁。因此,您应该使用
a&getA()
返回对私有字段
a
的引用。然后您可以通过
getA()
调用类A的任何公共方法

更进一步地说,使用
a&getA()
,客户端可以控制您的私有成员,这通常不是一个好主意。也就是说,可以使用类a的另一个对象更改私有字段
a
,就像使用
getA()=A2
一样。您应该添加一个常量版本:
const a&getA()const


因此,只需在类B中添加另一个方法@kiviak answered,我个人认为这是满足您需求的最佳实践。

您应该在getter中返回一个引用:
a&getA()
使其按预期工作。您的意思是
B::setNum
?在我的例子中,实际上有两个以上的层次结构(接近5)。所以这个解决方案需要做很多工作,但它似乎仍然是更好的方法。我认为如果可以的话,通常应该避免将“句柄”返回到对象内部。“我认为基维亚克的回答更为概括。”克里斯·德鲁+1。正如我刚才修改的那样。