访问私人会员

时间:2011-09-12 15:03:07

标签: c++ encapsulation

我有一个班级:

class A
{
private:
ComplexClass member1;

public:
getMember1(){return member1;};
};

我有一个实现,为了简化代码(更容易理解),需要检索该member1以使用它。我想到的第一件事就是:

ComplexClass *myComplexClass = &getMember1();

myComplexClass.getSomething();
myComplexClass.getSomethingElse();
etc.

这显然是不正确的,因为我从新对象而不是从member1检索指针(并获取编译器警告)。

我的问题是:做这样的事情最好的设计是什么?我如何保持封装,并使用指针来促进成员的访问? (我只想从member1读取,而不是写在上面)。

我应该做一个

ComplexClass *getPointerToMember1()

在A班内?

2 个答案:

答案 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; }