0

这里我们有两个类,我们称之为TreeFruit。A在任何给定时间Tree只能有一个或没有s。FruitAFruit只能在一个 上Tree。从Tree对象中,您可以Fruit通过函数获取它getTreeFruit( )。从对象中,您可以通过返回对象Fruit的函数获取其“所有者” 。getFruitOwner( )Tree

现在在Tree标题中,我们有这个:

#include "Fruit.h"
class Tree {
   private:
      Fruit m_Fruit; // The fruit in the tree.

   public:
      Tree ( Fruit tree_fruit );
      Fruit getTreeFruit( ); // Returns m_Fruit.
}

Fruit标题上:

#include "Tree.h"
class Fruit {
   private:
      Tree m_Owner; // The Tree object that "owns" the fruit.

   public:
      Fruit ( Tree fruit_owner );
      Tree getFruitOwner( ); // Returns m_Owner.
}

我意识到TreeFruit包含彼此的头文件,这会导致错误。我该如何解决错误?

非常感谢先进。:)

4

4 回答 4

3

您应该在 Fruit 对象中存储对 Tree 的引用,而不是树本身。

在这里,引用是比指针更好的选择,因为它们表达了水果不能神奇地从一棵树跳到另一棵树的情况。只有在构造对象时才能设置引用,因此您必须在构造函数中使用初始化列表。

然后,您可以使用 Tree 的前向声明。

  class Tree;

  class Fruit {
   private:
      Tree &owner; // The Tree object that "owns" the fruit.

   public:
      Fruit (Tree &fruit_owner ) : owner(fruit_owner)
      { ... };

      Tree &getFruitOwner( ); // Returns owner.
于 2012-08-03T09:50:47.167 回答
1

使用类的前向声明并将树作为指针

class Tree;
class Fruit {
   private:
      Tree *m_pOwner; // The Tree object that "owns" the fruit.

   public:
      Fruit ( Tree *fruit_owner );
      Tree* getFruitOwner( ); // Returns m_Owner.
}
于 2012-08-03T09:47:54.050 回答
1

我意识到 Tree 和 Fruit 包含彼此的头文件,这会导致错误。

这不是唯一的问题。基本上,您希望两个对象递归地相互包含,这是不可能的。

您可能想要的是让水果有一个指向它所属树的指针,并像这样向前Tree声明Fruit.h

树.h:

#include "Fruit.h"
class Tree 
{
    private:
        Fruit m_Fruit; // The fruit in the tree.

    public:
        Tree (Fruit tree_fruit);
        Fruit getTreeFruit(); // Returns m_Fruit.
}

水果.h

class Tree;

class Fruit 
{
    private:
        Tree* m_Owner; // The Tree object that "owns" the fruit.

    public:
        Fruit(Tree* fruit_owner);
        Tree* getFruitOwner(); // Returns m_Owner.
}
于 2012-08-03T09:49:47.700 回答
0

你应该使用forward declaration

class Tree;

class Fruit {
   private:
      Tree *m_Owner; // The Tree object that "owns" the fruit.

   public:
      Fruit ( Tree *fruit_owner );
      Tree *getFruitOwner( ); // Returns m_Owner.
}
于 2012-08-03T09:48:13.197 回答