2

我有一个在我的 C++ 程序中命名的树结构类SuperTree,我希望它有一个实例方法,该方法返回一个structpair其中一个属性是指向SuperTree对象的指针。

insert我的类中的函数SuperTree应该返回一个Res结构,其中包含对另一个SuperTree对象的引用和一个布尔值。但是,如果我尝试编译代码,则会收到以下错误消息:

supertree.cpp:24: error: ISO C++ forbids declaration of ‘Res’ with no type

我也不能Res在我的课之前定义结构,SuperTree因为它也不会编译。也许这是 C++ 泛型类型或其他东西(我还不知道如何使用)的情况。

所以这是我的尝试:

#include <cstdio>
#include <utility>
using namespace std;

class AVL {
public:
    int key;
    int bf;
    AVL* leftChild;
    AVL* rightChild;

    AVL()
    {
    }

    ~AVL() {};

    AVL rotateLeft();
    AVL rotateRight();

    Res* insert(int value);

    int remove();
    int size();
};

// typedef pair<AVL, bool> result;

typedef struct result {
  struct AVL *avl;
  bool changed;
} Res;

请注意,pair定义已被注释掉,但是你们也可以为他们回答,我很高兴!

就是这样,我怎样才能在我的类中同时拥有SuperTree类和Res结构以及Res指针返回函数SuperTree

欢迎任何帮助。谢谢!

4

2 回答 2

2

如果两个类或结构必须相互引用,则需要为其中一个或另一个添加前向声明,如下所示:

struct Res; // No typedef is necessary in C++
class AVL {
    ...
    Res* insert(int value);
};
struct Res {
    AVL *avl;
    bool changed;
};

请注意,它pair<AVL*,bool>也可以代替Res,让您跳过前向声明:

class AVL {
    ...
    std::pair<AVL*,bool> insert(int value);
};
于 2013-06-29T02:22:50.143 回答
2

因为两个类在定义时都不需要知道另一个类的大小,所以可以使用前向声明

  1. 您可以AVL先声明:

    class AVL;  // forward declaration
    
    typedef struct result {
      // Type size information not necessary at declaration time
      // for pointer and reference members,
      // so a forward declaration is enough at this point.
      struct AVL *avl;
      bool changed;
    } Res;
    
    class AVL {
    public:
    ...
        Res* insert(int value);
    };
    
  2. 或者Res先声明:

    struct Res;  // forward declaration
    
    class AVL {
    public:
    ...
        // Type size information is not necessary for return values
        // at function declaration time, so a forward declaration
        // is enough at this point.
        // Note: you can even return by value here.
        Res* insert(int value);
    };
    
    struct Res {
      struct AVL *avl;
      bool changed;
    };
    

请注意,您不必像在 C 中那样在 C++ 中对结构进行 typedef,因为您可以使用不带“struct”关键字的类型名称,因此struct Res {...}并且typedef struct result {...} Res应该是相同的,除非您不能前向声明后者。

于 2013-06-29T02:23:07.037 回答