授予对另一个类的函数访问,而无需公开它

Granting access on a function to another class without exposing it

本文关键字:访问 另一个 函数      更新时间:2023-10-16

我有一个类,让我们称其为 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_;
}

PersonPersonController都是我正在设计的库的公共接口的一部分。

我希望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 不会让您允许您这样做。

但是您的问题也取决于意见。