2013-04-30 83 views
0

假设我们是在这种情况下:C++私有数据成员访问:良好做法

class C { 
    int a, b; 
public: 
    C(int aa, int bb) { 
     setA(aa); 
     setB(bb); 
    } 
    void setA(int aa) { a = aa; } 
    int getA() { return a; } 
    void setB(int bb) { b = bb; } 
    int getB() { return b; } 
    C add(const C c1, const C c2); 
}; 

如果add()我需要访问的数据成员,这是做的最好的方法是什么?我应该使用访问功能setget(为客户端程序员创建),或者我可以简单地使用数据成员(c1.a,c1.b,c2.a,c2.b),因为我是类设计师?

+3

您是否打算添加'虚拟'? – 2013-04-30 11:13:30

+0

在构造函数中,不需要调用set函数。直接设置'a = aa'和'b = bb' – tianz 2013-04-30 11:15:10

+0

@Koushik So.他做什么都没有违法。 (有一些可疑的问题,比如'add'函数有三个参数,或者'const C'在忽略const的上下文中,或者对于所有成员都有getter和setter ) – 2013-04-30 12:38:34

回答

5

您可以使用。这取决于你希望你的setter/getters是那样,还是有一些额外的功能。例如,获取者也可能更新一个该成员被访问次数的计数器,因此通过获取者访问它们,即使是在类中,也可能更有意义。

无论哪种方式,这不是设计中最重要的部分。您首先需要了解封装的真正含义。让成员private和提供getter和setter不会比首先将它们设置为public(好吧,对于调试目的来说它更好,但在概念上它是相同的)。

你真的需要它们吗?

此外,获得者应该制作const,你应该通过c1c2const参考。

+0

'让成员**私人**'并提供getter和setter并不比让它们在第一位公开更好......'如何在不使用getter的情况下访问私人成员?友谊?但友谊打破'封装'!我不明白你的观点。 – Mushy 2013-04-30 13:25:18

+0

@Mushy如果它们是公开的,你可以直接访问它们。我的观点是私人成员加上吸气剂和封送剂也破坏封装。 – 2013-04-30 13:30:27

+0

如果他们是'private',那么如果他们不使用'getters'或者在不使用'setters'的情况下修改它们,如何访问它们?如果“封装领域”并不比公开成员更好,排除友谊,他们是如何获得的? – Mushy 2013-04-30 13:33:49

2

请直接使用它。设置/获取是从课外访问成员。

1

由于add是类的成员函数,因此您可以直接访问私有数据成员。通常设置和获取功能用于客户端访问。

1

在这个特殊的例子中,我直接使用变量名。

但也有类似的情况,吸气/安装人员更多的使用。

例如,当二传手(或吸气)功能不仅仅是琐碎x = y更加复杂:

void SetA(int aa){ //a between 0 and 100 
    a = std::max(0, std::min(aa, 100)); 
} 

或者当你要继承C和超负荷的getter/setter或add功能。