我有一个班级:
class A
{
private:
ComplexClass member1;
public:
getMember1(){return member1;};
};
我有一个实现,为了简化代码(更容易理解),需要检索该member1以使用它。我想到的第一件事就是:
ComplexClass *myComplexClass = &getMember1();
myComplexClass.getSomething();
myComplexClass.getSomethingElse();
etc.
这显然是不正确的,因为我从新对象而不是从member1检索指针(并获取编译器警告)。
我的问题是:做这样的事情最好的设计是什么?我如何保持封装,并使用指针来促进成员的访问? (我只想从member1读取,而不是写在上面)。
我应该做一个
ComplexClass *getPointerToMember1()
在A班内?
答案 0 :(得分:3)
const引用将阻止它们编辑。在我看来,它使你的意图比一个const指针更清晰。
class A
{
private:
ComplexClass member1;
public:
const ComplexClass &getMember1(){return member1;};
};
答案 1 :(得分:1)
您将按值返回该成员,该值会生成ComplexClass
成员的副本。因此,当您调用后续方法(以及编译器告诉您的内容)时,您不会处理实际成员。
我认为有助于维护封装和减少耦合的更惯用的C ++方法是创建一个算法成员:
A::doStuff()
{
member1.getSomething();
member1.getSomethignElse();
}
这样,使用class A
的任何人都不会关心该实现使用ComplexClass
,而只是知道他们可以告诉A
做一些事情工作,它将以最好的方式完成。
编辑评论:在这种情况下,我建议在A
中创建从ComplexClass
获取值的方法(再次隐藏您的实现)。如果这不合适,那么您可以通过const引用返回实现:const ComplexClass& getMember1() const { return member1; }