如何在c ++中递归调用一个类?

时间:2017-11-07 00:08:01

标签: c++ data-structures fibonacci-heap

您好,这是代码:

template <class T> class FibonacciHeap{
public:
    class Entry{
        public:
            // Returns the element represented by this heap entry.
            T getValue(){
                return mElem;
            }

            // Sets the element associated with this heap entry.
            void setValue(T value){
                    mElem = value;
            }

            // Returns the priority of this element.
            double getPriority(){
                return mPriority;
            }

        private:
            int mDegree = 0;                // Number of children
            bool mIsMarked = false;         // Whether the node is marked

            Entry mNext;                    // Next element in the list
            Entry mPrev;                    // Previous element in the list

            Entry mChild;                   // Child node, if any
            Entry mParent;                  // Parent node, if any
            T mElem;                        // Element being stored here
            double mPriority;               // Its priority

            //Constructs a new Entry that holds the given element with the indicated priority.
            Entry(T elem, double priority){
                mNext = mPrev = this;
                mElem = elem;
                mPriority = priority;
            }
    };
    ...

在Class&#34; Entry&#34;我想递归调用Entry,所以我可以使用:

    First_entry.mPrev.mNext

我知道这适用于Java,但是当我用c ++编译它时,我得到:

    error: 'FibonacciHeap<T>::Entry::mNext' has incomplete type

有谁知道如何解决这个问题或解决这个问题?

1 个答案:

答案 0 :(得分:3)

基于这里的变量名和初始值设定项,我假设您正在将Java Fibonacci heap调整为C ++。 :-)如果是这样,祝你好运!

在Java中,如果你有一个Entry类型的变量,它就像一个Entry*类型的C ++变量,因为它是指向另一个Entry对象的指针,而不是一个诚实的 - 善良Entry对象。因此,在Entry类的定义中,您应调整字段,使其类型为Entry*而不是Entry。同样,您需要使用.运算符,而不是使用->运算符来选择字段。所以

First_entry.mPrev.mNext

将被重写为

First_entry->mPrev->mNext

不要忘记显式初始化Entry nullptr指针 - Java会自动执行此操作,这就是Java版本中没有初始化程序的原因。但是,C ++提供了未初始化的指针垃圾值,因此请确保为mChildmParent提供明确的nullptr值。