我有一个必须被访问的类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);
^
答案 0 :(得分:5)
嗯,很明显,您无法从另一个类访问类的受保护/私有成员。如果您尝试与受保护/私有成员函数建立联系,也是如此。因此,除非您将该方法放在公开部分或将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
};
答案 1 :(得分: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);
}
};