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 ++中的朋友保护方法的主要内容,如果未能解决你的问题,请参考以下文章