C ++中的朋友保护方法

Posted

技术标签:

【中文标题】C ++中的朋友保护方法【英文标题】:Friend protected method in c++ 【发布时间】:2014-10-10 13:48:38 【问题描述】:

我有一个 Foo 类,它必须在其他类 Bar 中“直接”访问。我想构建一个小框架,声明 Bar 的方法(它是 Foo 的友元方法)受保护。通过这种方式,我可以构建几个 Bar 的子类。

Gcc 对此表示抱怨,并且仅当方法是公开的时它才有效。

我该怎么办?我的代码示例:

class Foo;
class Bar 
    protected:
        float* internal(Foo& f);
;
class Foo 
    private:
        //some data
    public:
        //some methods
        friend float* Bar::internal(Foo& f);
;

Gcc 消息:

prog.cpp:4:16: error: ‘float* Bar::internal(Foo&)’ is protected
         float* internal(Foo& f);
                ^
prog.cpp:11:43: error: within this context
         friend float* Bar::internal(Foo& f);
                                           ^

【问题讨论】:

你试过保护Foo的方法吗? @redFIVE 是的,它不起作用。 您是否尝试将 Foo 类声明为 Bar 类的朋友(在 Bar 类中)? 你有没有尝试将Bar的定义放在Foo的定义之前? @Ashalynd 有了你的建议,gcc 现在编译代码,即使有点奇怪,因为现在 Foo 可以访问 Bar 的每个字段。哇。 【参考方案1】:

嗯,很明显,您不能从另一个类访问一个类的受保护/私有成员。如果您尝试将受保护/私有成员函数加为好友,这也是正确的。所以,你不能这样做,除非你把方法放在公共部分或者让Foo成为Bar的朋友。

您也可以通过让整个班级Bar 成为Foo 的朋友来做到这一点。所以要么这样做:

class Bar 
protected:
    friend class Foo; // Foo can now see the internals of Bar
    float* internal(Foo& f);
 ;
class Foo 
private:
    //some data
public:
    //some methods
    friend float* Bar::internal(Foo& f);
;

或者这个:

class Bar 
protected:
    float* internal(Foo& f);
;
class Foo 
private:
    //some data
public:
    //some methods
    friend class Bar; // now Bar::internal has access to internals of Foo
;

【讨论】:

gcc3 确实没有问题,这并不明显。我想我会选择 Foo 解决方案的酒吧。谢谢。【参考方案2】:

如果您想让Foo 只能通过单个非公共方法访问而不能完全访问Bar,您可以为该任务创建一个中间class

class Foo;
class Bar;
class FooBar 
    friend Foo;
    friend Bar;
    Bar &bar_;
    FooBar (Bar &b) : bar_(b) 
    float* internal(Foo &f);
;

class Foo 
    private:
        //some data
    public:
        //some methods
        friend float* FooBar::internal(Foo& f);
;

现在,Bar 可以在它自己的 protected 版本的该方法中调用该中间类。

class Bar 
    friend FooBar;
    // some private data
    protected:
        float* internal(Foo& f) 
            FooBar fb(*this);
            return fb.internal(f);
        
;

【讨论】:

以上是关于C ++中的朋友保护方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP 朋友/包可见性

与java中的私有/受保护方法相关的性能与设计[关闭]

为啥派生类的朋友不能使用受保护的成员?

一些Python中的二维数组的操作方法

在 C++ 库中隐藏 C 头文件中的函数

微信小程序分享至朋友圈的方法