【发布时间】:2018-05-31 05:59:24
【问题描述】:
我有一门课,我们叫它Person:
class Person{
private:
void move(x,y,z);
}
我还有一个班级叫PersonController:
class PersonController{
public:
void control(){
while(some_thing){
//do some calculations
controlled_person_->move(some_values); //Wrong Accessing to a private member
}
}
private:
Person* controlled_person_;
}
Person 和 PersonController 都是我正在设计的库的公共接口的一部分。
我希望PersonController 能够从Person 呼叫move。但是,我不希望任何人从公共界面访问此功能(move)。
解决问题的简单方法是添加友谊,以便PersonController 可以访问Person 的私人成员。然而,据我所知,friend 关键字并没有被引入来解决这类问题,在这里使用它是一种不好的做法。
- 这是正确的吗?我应该在这里避免
friend吗? - 这是否意味着我的设计被破坏了?
- 还有其他建议吗?
【问题讨论】:
-
这些类是同一个逻辑接口的一部分吗?意思是,没有
PersonController,你就不能拥有Person? -
不,你可以有一个
Person没有PersonController -
您的前两个问题以 SO 的格式无法回答。你应该避免它吗?谁知道。这可能是最简单和最正确的解决方案,具体取决于您的整个设计。请允许我颠倒这个表格。
Person里面有什么东西不能让PersonController接触吗? -
当然可以。例如,人名是不应该被触及的东西。 PersonController 只是一个运动控制器。
-
@HumamHelfawi,我认为您正在尝试使用
friendship 克服设计错误。我猜函数Person::move将一个对象移动到一个新位置。这意味着Person有位置。理想情况下,这听起来不像Person的内在数据。你能解耦这些概念,以便不同的类负责跟踪Persons 的位置吗?您可以使用该类来移动Person。
标签: c++ design-patterns