2011-09-12 143 views
1

我有一个类:访问私有成员

class A 
{ 
private: 
ComplexClass member1; 

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

,我有,为了简化代码(更容易理解),需要检索的member1与它合作的实现。这是要我的脑海里的第一件事是:

ComplexClass *myComplexClass = &getMember1(); 

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

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

我的问题是:做这种事情的最佳设计是什么?我该如何保持封装,并利用指向它的指针访问成员? (我只想从member1读取,而不是写在它上面)。

我应该做一个

ComplexClass *getPointerToMember1() 

A类里面?

+0

'ComplexClass myComplexClass = a.getMember1(); myComplexClass.getSomething();'? –

+0

你可能不应该添加一个getter开始。为什么外部实体需要访问成员1.这是唯一的实体吗?如果是这样,让它成为朋友。 –

回答

3

const引用将阻止它们进行编辑。在我看来,它使你的意图比const指针更清晰。

class A 
{ 
private: 
ComplexClass member1; 

public: 
const ComplexClass &getMember1(){return member1;}; 
}; 
+1

请记住,这可能会使封装更加棘手,因为这意味着您需要引用一个ComplexClass对象。 (想象一下'A'的未来实现,它不会维护成员变量,但可以根据需要动态创建一个'ComplexClass'对象。) –

+0

好的。但我相信:ComplexClass myComplexClass = A.getMember1(); myComplexClass.someInteger = 10;是一个有效的实现。 –

+0

@Oli给出这个例子,我们已经创建了一个对象。这是措辞的方式,我认为代码已经耦合了一点太高。尽管如此,我可以看到这对于一个奇怪的单元测试很有用。 –

1

你返回由值的成员,这使得一个复制ComplexClass成员的。因此,当您调用后续方法时(以及编译器告诉您的是什么),您不是在处理实际成员。

我认为更地道的C++方式,可以帮助保持封装和降低耦合是创建一个算法员:

A::doStuff() 
{ 
    member1.getSomething(); 
    member1.getSomethignElse(); 
} 

此使用class A方式有人不护理的实现使用ComplexClass但他们只知道他们可以告诉A做一些工作,并且会以最好的方式完成。

编辑评论:在这种情况下,我会建议创建方法AComplexClass获得值(再次隐藏您的实现)。如果这不合适,那么你可以通过const引用返回实现:const ComplexClass& getMember1() const { return member1; }

+0

是的,这将是一个好方法,但它不是这种情况下的有效选择。正如我写的,我想访问member1中的数据,而不是执行它的工作。 –