互惠的朋友成员函数=循环包含声明

时间:2011-05-31 18:02:42

标签: c++ friend circular-dependency

我在不同的h文件中定义了两个类,每个类都有一些私有函数。但是,每个类中都有一个函数,我希望能够从另一个类中的函数访问它。

例如......

//apple.h:

class Beets;

class Apple
{
public:
    double  ShadeUsed();
private:
    void    Fruit();
    bool    RedRoots();
    friend  bool Beets::BlueRoots(); //<--- Error b/c not declared yet
};


//beets.h
#include "apple.h"

class Beets
{
    public:
    double  SunNeeded();
private:
    void    Leaves();
    bool    BlueRoots();
    friend  bool Apple::RedRoots();
};

目标是每个类中只有一个函数可以访问其他类私有东西。例如,只有root函数才能访问其他类的私有内容。然而,如果没有包括成为循环,我就无法实现互惠友谊。

我已经考虑过,例如,整个Beets类是Apples的朋友,那样类预先声明就足够了,但我宁愿只允许一个函数私有访问。

有什么建议吗? 提前致谢, 太

(P.S。为什么在“提前谢谢”,“马特”之间的回车不会导致换行?)

2 个答案:

答案 0 :(得分:2)

您可以使用调用成员函数的友元函数。

//apple.h:

class Beets;

class Apple
{
public:
    double  ShadeUsed();
private:
    void    Fruit();
    bool    RedRoots();
    friend  bool Beets_BlueRoots(Beets* beets); 
    friend  bool Apple_RedRoots(Apple* apple);
};

bool Apple_RedRoots(Apple* apple);


//beets.h

class Beets
{
    public:
    double  SunNeeded();
private:
    void    Leaves();
    bool    BlueRoots();
    friend  bool Apple_RedRoots();
    friend  bool Beets_BlueRoots(Beets* beets);
};

bool Beets_BlueRoots(Beets* beets);

答案 1 :(得分:-1)

看来你有一些设计问题。我建议继承:

class A{
public:
   virtual bool Roots();
}
class Apples : public A
{}
class Beets : public A
{}

现在,Apple和Beets都有Roots功能,没有循环包含,而且它是公共的,所以他们可以互相访问(而且只有一个公共,所以你是安全的)。你根本不需要知道根是红色还是蓝色。如果您稍后创建“Carrot”类,则您的类也不需要更改为包含“OrangeRoots”。