2015-10-24 4 views
-2

Хорошо, вот моя проблема, если проблема вообще.Связанный список с вложенными классами: как я могу использовать вложенный тип класса до его объявления?

Я строю связанный список.
Этот связанный список состоит из элементов в форме класса.
Таким образом, у меня есть класс, называемый, допустим, linked_list и вложенный номер, который называется только node.

Очевидно, что основной класс предназначен для обработки узлов и предоставления некоторых функций для взаимодействия с ними.

Вот проект, как это должно выглядеть:

class linked_list 
{ 
public: 
    linked_list(); 
    ~linked_list(); 
    void setFirst(node *firstIn){first = firstIn;} 
    node* getFirst(){return first}; 
    void forward(); 
    void forward(unsigned char); 

private: 
    node *first; 
    node *current; 

    class node 
    { 
    public: 
     node(); 
     ~node(); 
     void function1(); 
     void function2(); 

    private: 
     int various_data; 
     node *next; 
    }; 
}; 

Теперь, как вы можете себе представить, компилятор дает мне ошибку (два, на самом деле), который говорит мне, что node тип/класс имеет еще не объявлен, когда я использую его в публичном разделе класса linked_list для объявления аргументов функций и возвращаемых типов.

Я предполагаю, что я мог бы просто инвертировать public: и private: секции таким образом, что декларация node класса предшествует его использование, но это escamotage бы раздражать мой (мягкий) OCD путь слишком много для меня, чтобы соблюдать его.

Действительно ли нет способа, кроме инвертирования public: и private:?
Это убивает меня!

+0

Почему я получил -1? Потому что я не дал легкий значок первым, кто ответил? Суровая аудитория, это место, предназначенное для помощи ... –

+0

-2? Бедные дети, они не получат приз. –

ответ

1

Вы можете использовать форвардную декларацию .

#include ... 

class node; 

public class linked_list { 
... 
} 

Примечание: Это поражение цели внутреннего класса, потому что вы подвергаете его в заголовке. Таким образом, это нормально сделать для простого упражнения, но это будет плохое архитектурное решение.

+1

Я надеюсь, что это не нарушит никаких правил здесь, в stackOverflow, но ... Я люблю тебя, мужик. Мой OCD благодарит вас. –

+0

@SergeBallesta Что значит? Я только что добавил объявление вперед, и оно работает, оно компилируется и запускается без жалобы. Что-нибудь, о чем я должен знать, может нарушить мою программу? –

+0

Итак, ваше изменение проясняет комментарий Сергея Баллеста (теперь исчез). И что? Как еще? –