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。正如我刚才修改的那样。