2

我有一个必须在其他类 Bar 中“直接”访问的类 Foo。我想构建一个小框架,声明 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);
};

海合会消息:

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);
                                           ^
4

2 回答 2

5

好吧,很明显,您不能从另一个类访问一个类的受保护/私有成员。如果您尝试将受保护/私有成员函数加为好友,这也是正确的。因此,除非您将该方法放在公共部分或FooBar.

您也可以通过让整个班级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
};
于 2014-08-17T14:36:48.607 回答
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);
        }
};
于 2014-08-17T14:42:57.030 回答