структуры данных — Как рекурсивно вызывать класс в C ++?

Здравствуйте, это код:

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;
}
};
...

В классе «Entry» я хочу вызвать Entry рекурсивно, поэтому я могу использовать:

    First_entry.mPrev.mNext

Я знаю, что это работает в Java, но когда я компилирую это в C ++, я получаю:

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

Кто-нибудь знает, как это исправить или обойти это?

0

Решение

Основываясь на именах переменных и инициализаторах здесь, я предполагаю, что вы адаптируете мой Ява Фибоначчи куча в C ++. 🙂 Если так, то удачи!

В Java, если у вас есть переменная типа Entry, он действует как переменная типа C ++ Entry* в том, что это указатель на другой Entry объект, а не честность к добру Entry объект. В результате в определении Entry класс, вы должны настроить поля так, чтобы они были типа Entry* скорее, чем Entry, Аналогично, вместо использования . оператор для выбора полей, вы хотите использовать -> оператор. Так

First_entry.mPrev.mNext

будет переписан как

First_entry->mPrev->mNext

Не забудьте явно инициализировать Entry указатели на nullptr — Java делает это автоматически, поэтому в версии Java нет инициализаторов. Тем не менее, C ++ дает неинициализированные указатели мусорных значений, поэтому обязательно укажите mChild а также mParent явный nullptr значение.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]