【问题标题】:How to restrict part of public interface of a class to only one class?如何将一个类的部分公共接口限制为一个类?
【发布时间】:2011-06-30 14:37:02
【问题描述】:

下面是一个界面:

class SIM{
private:
//private data

public:
Send();
Display();
Recieve();
Encrypt();
};

我如何限制对SIMDisplay() 函数(它必须位于public 部分)的访问,除了一个类(Neo 等)之外的其他类。我不想使用friend 等。

编辑:

我可以将 display() 移动到 private ,我如何只允许 NEO 类访问它? 0_o

【问题讨论】:

  • 你为什么不想用朋友?
  • 如果Display() 必须在public 访问中,那么任何人都可以访问它,不管任何技巧!这是不可能的。
  • 朋友在这里是合适的解决方案。这就是他们的设计目的。没有它,这是不可能的。你的问题没有多大意义。
  • @M3ta:好吧,您排除了旨在解决此问题的确切机制。你能解释一下为什么你不能使用朋友,以及为什么方法必须是公开的吗?
  • 这是作业吗?还有谁会提出这样的要求,使您不能使用明确设计的语言功能来解决您遇到的问题?如果这是家庭作业,那就是无用的作业。通过宣布正确方式禁止使用来学习错误方式做某事是没有意义的。

标签: c++ oop accessibility


【解决方案1】:

您可以让Display 对只能从私有嵌套在您希望能够进行调用的类中创建的类型进行虚拟 const 引用。然后为了将该类型传递给Display,您必须是该类的成员。

但是,当friend 完全按照您的意愿行事时,您为什么要这样做呢?

代码示例:

class AllowedCaller
{
private:
    class FriendHackHelp
    {
    };

public:
    class FriendHack
    {
    public:
        // You can only create a FriendHack from inside this class now...
        FriendHack(const FriendHackHelp&) { }
    };

    void run();
};

class Displayer
{
public:
    void Display(const AllowedCaller::FriendHack&) { /* Whatever */ }
};

void AllowedCaller::run()
{
    Displayer d;
    d.Display(FriendHack(FriendHackHelp()));
}

int main()
{
    return 0;
}

【讨论】:

  • 感谢您的解决方案。我现在就用朋友。我的许多(现实生活中的)朋友说不要使用朋友 :)
【解决方案2】:

在 C++ 中,这根本不可能。您可以做的是将Neo 类作为参数传递给Display() 函数作为参考,您将获得类似的效果。

【讨论】:

    【解决方案3】:

    您还可以将 SIM 类拆分为 2 个类:Displayable(使用 Display 方法)和 SIM(使用其余方法)。然后,在创建 Neo 类时,干脆不要扩展 Displayable 类。

    【讨论】:

      【解决方案4】:

      让我问你一个问题:neo 到底是什么?它可以从SIM继承吗?如果是这样,请将 Display() 设为 protected 而不是 private

      【讨论】:

        【解决方案5】:

        我过去也一直在想这个问题,请检查以下问题:

        programming language with granular method and property access

        a way in c++ to hide a specific function

        但是,我提出这样的想法,即实现这一点的唯一方法(至少在 C++ 中)是为每个客户端类创建多个接口,并使每个接口成为将访问它的客户端类的朋友

        所以你需要用多重继承实现所有和每个接口

        【讨论】:

        • 有什么特别的理由不使用朋友吗?还是您在考虑不同程度的粒度?
        • 是的,不同程度是目标,这可能通过多个接口来实现,事实上,我后来意识到试图让一个接口服务多个具有不同访问级别的客户端尖叫 i> 对于一个试图做太多事情并且需要拆分的接口(不可避免地需要权衡多继承的丑陋,但如果你小心的话,这还不错)
        猜你喜欢
        • 2016-01-18
        • 2023-03-11
        • 2011-05-25
        • 2011-09-16
        • 2011-11-03
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多