是"类原型"在C ++中可能吗?

时间:2014-05-07 16:32:21

标签: c++ class heap priority-queue function-prototypes

我正在尝试在C ++中实现优先级队列(作为指针堆)。这可能是也可能不是糟糕的设计,但我创建了一个PriorityQueue类(它将包含整个堆)和堆中每个节点的另一个类Node。它看起来像这样:

class PriorityQueue {
    public:
        Node* root;

        void insert(Node* n) {
            n->ancestor = this;
            root->insert(n);
        }
}

class Node {
     public:
         PriorityQueue* ancestor;
         Node* parent, left, right;

         void insert(Node* n) { /* really long insert algorithm */ }
}

这些类互相引用,所以我需要某种原型。我尝试在开头添加class PriorityQueue;class Node;,但是因无效使用不完整类型而出错。是否有可能按照我想要的方式做到这一点,或者我应该完全改变我的设计?

2 个答案:

答案 0 :(得分:3)

让我们忘记术语 prototype ,并专注于前向声明定义

前向声明告诉编译器存在类(或结构或联合)以及类的名称。而已。这通常在头文件中用于解析参数和返回类型的指针和引用。

编译器需要一个完整的定义才能解析对结构中内容的访问。

答案 1 :(得分:3)

“无效使用不完整类型”的问题是因为您在insert类中定义PriorityQueue方法的方式。为了解决这个问题,您需要做的就是在声明Node之后将实现移动到某个位置,如下所示:

class Node; // <<== I assume that you already have this
class PriorityQueue {
    public:
        Node* root;
        // At this point, the definition of Node is incomplete.
        // You can declare pointers or references of type Node,
        // but you cannot call its member functions, because the compiler
        // does not know what functions are available for the Node.
        void insert(Node* n);
}; // <<== Do not forget semicolons
class Node {
     public:
         PriorityQueue* ancestor;
         Node* parent, left, right;
         void insert(Node* n);
}; // <<== Do not forget semicolons
// At this point, C++ compiler knows what functions the Node has,
// so it lets you make calls of member functions.
void PriorityQueue::insert(Node* n) {
    n->ancestor = this;
    root->insert(n);
}
void Node::insert(Node* n) {
    /* really long insert algorithm */
}