授予对另一个类的函数访问,而无需公开它
Granting access on a function to another class without exposing it
我有一个类,让我们称其为 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
)。
Sovle的简便方法是添加友谊,因此PersonController
可以访问Person
的私人成员。但是,就我阅读而言,没有引入friend
关键字来解决这类问题,在这里使用它是一个不好的做法。
- 这是正确的吗?我应该在这里避免
friend
吗? - 这是否意味着我的设计被打破了?
- 有其他建议吗?
根据您在评论中所说的内容,您似乎有兴趣仅允许PersonController
触摸该成员函数。做到这一点的方法就是将门公开,但为此添加一个私钥:
class Person{
public:
class MovePrivilege {
move_privilege() = default; // private c'tor
friend class PersonController; // only PersonController may construct this
};
void move(MovePrivilege, x,y,z);
};
class PersonController{
public:
void control(){
while(some_thing){
//do some calculations
controlled_person_->move(MovePrivilege{} , some_values);
}
}
private:
Person* controlled_person_;
};
MovePrivilege
类型具有私人c'14。因此,它只能由朋友构建。调用move
也需要。因此,虽然move
是公开的,但唯一称其为MovePrivilege
的朋友。
这实质上使您可以对谁呼叫移动进行精细的谷物控制。如果这是令人难以置信的,并且您无法更改移动,那么律师客户成语的变体可能是适当的。
您确实可以选择。直接firend
-Ship只是最直率的工具。
,这正是朋友的意图。如果您的设计需要最小化友谊,则没有理由不使用它。
我看到不使用朋友的不断使用,就像持续不喜欢" goto",在某些时候,使用它会使设计变得更加干净。
是的,您的设计不正确。
类是数据结构的扩展概念:像数据结构一样,它们可以包含数据成员,但它们也可以包含作为成员的功能。您可以在这里阅读更多
so PersonController(如果仅控制人员类)不应该是一类,因为它不是数据结构的概念检查是否可以合并或以其他方式设计。
有很多方法可以做到。如果您想像现在这样设计的那样设计它,可以使用受保护的访问控制器并创建派生类,但它不是一个好的设计。
您也可以在这里使用朋友函数,但它不是一个面向对象的概念(而是最简单的方法)。
您应该重新考虑您的设计如果要设计它oo .bave.bave,您无法从面向对象的编程中的其他类访问私有功能,它会破坏封装,因此C 不会让您允许您这样做。
但是您的问题也取决于意见。
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 让 Redhawk 组件访问另一个组件的属性
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 访问另一个类中的模板化嵌套类函数和对象
- 继承:访问另一个类的私有和公共部分
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 访问另一个类的数据,其对象在构造函数中作为参数发送
- 访问另一个.cpp文件中的.cpp文件中定义的全局变量
- 错误访问另一个插件中的类(错误:未定义的引用)
- 通过"this"访问另一个对象的定义?
- 如何在实际类中访问另一个类的对象的实例
- 在一个结构中,使用一个数组字段访问另一个是否合法
- 从抽象基类访问另一个基类成员
- 如何从一个类访问另一个类中的结构
- 链表:无法访问另一个结构中的结构向量
- 如何在 C++ 中访问另一个类中的矢量对象
- 在一个线程中创建一个对象,并使用std :: Atomic访问另一个对象
- 使用访问另一个类字段的比较器priority_queue类字段
- 如何以这种方式访问另一个文件的方法/函数