Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将类的部分公共接口限制为仅一个类?_C++_Oop_Accessibility - Fatal编程技术网

C++ 如何将类的部分公共接口限制为仅一个类?

C++ 如何将类的部分公共接口限制为仅一个类?,c++,oop,accessibility,C++,Oop,Accessibility,以下是一个界面: class SIM{ private: //private data public: Send(); Display(); Recieve(); Encrypt(); }; 如何将SIM的Display()功能(必须位于public部分)的访问权限限制为除一个类(Neo等)以外的其他类。我不想使用朋友等 编辑: 我可以将display()移动到private,如何只允许NEO类访问它?C++中的0yo这是不可能的。您可以做的是将 No.类作为参数,以显示()/函数作为引用,

以下是一个界面:

class SIM{
private:
//private data

public:
Send();
Display();
Recieve();
Encrypt();
};
如何将
SIM
Display()
功能(必须位于
public
部分)的访问权限限制为除一个类(
Neo
等)以外的其他类。我不想使用
朋友

编辑:


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

这是不可能的。您可以做的是将<代码> No.<代码>类作为参数,以<代码>显示()/<代码>函数作为引用,您将得到类似的效果。C++中的

< P>这是不可能的。您可以做的是将
Neo
类作为参数传递给
Display()
函数作为参考,这样会产生类似的效果。

您还可以将SIM类分为两类:可显示(使用显示方法)和SIM(使用其余方法)。然后,在创建Neo类时,不要扩展Displayable类。

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

您可以让
Display
对一个类型进行伪常量引用,该类型只能从您希望能够进行调用的类中的私有嵌套类型创建。然后,为了将该类型传递给
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;
}

您可以让
Display
获取对类型的伪常量引用,该类型只能从您希望能够进行调用的类中的私有嵌套类型创建。然后,为了将该类型传递给
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;
}

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

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

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

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


因此,您需要使用多重继承实现所有和每个接口

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

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


因此,您需要使用多重继承实现所有和每个接口

为什么不使用friends?如果
Display()
必须在
public
access中,那么任何人都可以访问它,而不必考虑任何技巧!这是不可能的。朋友是合适的解决方案。这就是他们设计的目的。没有这一点,这是不可能的。你的问题没有多大意义。@M3ta:好吧,你排除了设计用来解决这个问题的确切机制。你能解释一下为什么你不能使用friends,为什么这个方法必须公开吗?这就是家庭作业?还有谁会创建这样一个需求,使您不能使用明确设计用于解决您遇到的问题的语言功能?如果这是家庭作业,那就没用了。通过宣布禁止使用正确的方法来学习错误的方法是没有意义的。为什么不使用friends呢?如果
Display()
必须在
public
访问中,那么任何人都可以访问它,而不必考虑任何技巧!这是不可能的。朋友是合适的解决方案。这就是他们设计的目的。没有这一点,这是不可能的。你的问题没有多大意义。@M3ta:好吧,你排除了设计用来解决这个问题的确切机制。你能解释一下为什么你不能使用friends,为什么这个方法必须公开吗?这就是家庭作业?还有谁会创建这样一个需求,使您不能使用明确设计用于解决您遇到的问题的语言功能?如果这是家庭作业,那就没用了。通过宣布禁止使用正确的方法来学习错误的方法是没有意义的。你有什么特别的理由不使用朋友吗?或者您考虑的是不同的粒度?是的,不同的粒度是目标,这可能通过多个接口实现,事实上,我后来认识到,尝试使用一个接口服务多个具有不同访问级别的客户端会让一个试图做得太多并且需要拆分的接口大吃一惊(多重继承不可避免地存在着丑陋的权衡,但如果你小心的话,这也没那么糟糕)你有没有什么特别的理由不使用friends?或者你在考虑不同的粒度?是的,不同的粒度是目标,可以通过多个接口来实现。事实上,我后来认识到,试图让一个接口服务具有不同访问级别的多个客户端需要一个尝试做得太多,需要拆分(不可避免地要权衡多重继承的丑陋性,如果你小心的话,这也没那么糟糕)谢谢你的解决方案。我现在就用朋友。我的许多(现实生活中的)朋友说不要用朋友:)谢谢你的解决方案。我现在就用这个朋友。我的许多(真实的)