在不破坏封装的情况下访问功能替代品
access function alternatives without breaking encapsulation
除了编写一堆访问函数或重载运算符之外,是否有任何其他方法或更短的替代方法来访问派生 class 中的私有基础 class 成员?
如果您的意思是从不在 class 或子 class 内的某个地方,那么不会。
但是如果你的意思是来自另一个 class 你可以使用 protected 关键字而不是 private 那么子 class 将能够访问那些数据成员而不需要 getter或 setter。
不,如果你想真正封装你的基础class,建议将成员设为私有,并且只允许通过函数访问。这允许你做一些事情,比如保留不变量。
但是您应该只向需要的成员提供访问权限。不要不假思索地为所有内容添加访问器。如果您发现确实需要提供对所有内容的访问权限,您可能需要重新考虑您的设计。
如果你愿意牺牲封装,你当然可以让成员受到保护。
这是一个非常简单的例子来显示差异
class parent {
friend void f(some&);
public:
int a_pc;
protected:
int b_pd;
private:
int c_pt;
};
void f(some& obj) {
obj.a_pc = 0; // OK
obj.b_pd = 0; // OK
obj.c_pt = 0; // OK
}
void g(some& obj) {
obj.a_pc = 0; // OK
obj.b_pd = 0; // compile time error
obj.c_pt = 0; // compile time error
}
class child : public parent {
child() {
a_pc = 0; // OK
b_pd = 0; // OK
c_pt = 0; // compile time error
}
};
除了编写一堆访问函数或重载运算符之外,是否有任何其他方法或更短的替代方法来访问派生 class 中的私有基础 class 成员?
如果您的意思是从不在 class 或子 class 内的某个地方,那么不会。
但是如果你的意思是来自另一个 class 你可以使用 protected 关键字而不是 private 那么子 class 将能够访问那些数据成员而不需要 getter或 setter。
不,如果你想真正封装你的基础class,建议将成员设为私有,并且只允许通过函数访问。这允许你做一些事情,比如保留不变量。
但是您应该只向需要的成员提供访问权限。不要不假思索地为所有内容添加访问器。如果您发现确实需要提供对所有内容的访问权限,您可能需要重新考虑您的设计。
如果你愿意牺牲封装,你当然可以让成员受到保护。
这是一个非常简单的例子来显示差异
class parent {
friend void f(some&);
public:
int a_pc;
protected:
int b_pd;
private:
int c_pt;
};
void f(some& obj) {
obj.a_pc = 0; // OK
obj.b_pd = 0; // OK
obj.c_pt = 0; // OK
}
void g(some& obj) {
obj.a_pc = 0; // OK
obj.b_pd = 0; // compile time error
obj.c_pt = 0; // compile time error
}
class child : public parent {
child() {
a_pc = 0; // OK
b_pd = 0; // OK
c_pt = 0; // compile time error
}
};