2015-01-23 3 views
0

Я пытаюсь написать класс связанного списка с некоторыми базовыми функциями, такими как добавление узла, удаление узла и поиск рекурсивно в списке. Я определил главу списка как приватную переменную, но мне нужно получить к ней доступ для функции рекурсивного поиска, поэтому я попытался определить функцию GetHead(), которая вернет указатель на голову. Однако у меня возникают проблемы с его компиляцией в NetBeans.Возвращение указателя на struct в связанном списке class

Вот заголовок класса

class List{ 
private: 

    typedef struct node{ 
     int data; 
     node* next; 
    }*nodePtr; 

    nodePtr head; 
    nodePtr curr; 
    nodePtr temp; 

public: 
    List(); 
    void AddNode(int addData); 
    void DelNode(int delData); 
    void PrintList(); 
    void SearchRecursive(nodePtr Ptr, int searchVal); 
    nodePtr GetHead(); 
}; 

Функция GetHead() выглядит следующим образом:

nodePtr List::GetHead(){ 
    return head; 
} 

Когда я компилирую, я получаю

error: unknown type name 'nodePtr' 
error: cannot initialize return object of type 'int' 
     with an lvalue of type 'nodePtr' (aka 'List::node *') 

Есть проблема в как я возвращаю указатель на узел структуры?

+0

'nodePtr GetHead();' Это не будет работать для области доступа public, так как 'nodePtr' объявлен в разделе' private' class. –

+0

@ πάνταῥεῖ На самом деле, он работает, если вы используете 'auto'. Пока вы не называете частную вещь ... – juanchopanza

+0

@juanchopanza Ах, THX! Полезно знать, не думал о 'auto'. –

ответ

4

nodePtr определяются в List, так что вам нужен правильный объем:

List::nodePtr List::GetHead() 
^^^^^^ 
+0

Уверен? 'NodePtr' typedef является классом' private', а 'GetHead()' является 'public'. –

+1

@ πάνταῥεῖ: Это не мешает вам определить функцию, она просто делает ее немного неудобной в использовании. –

+0

Это, казалось, исправить. Благодаря! – Bilentor

0

Есть два способа получить его компиляцию:

1) Вы определили на структуру внутри класса в частных сферах .... Это скрывает его от остального мира. Но, как указал juanchopanza, вам нужно указать область действия.

2) Еще один способ сделать это - взять определение узла вне класса, и он должен работать без изменения прототипа функции.

Первый из них был бы лучше, потому что остальная часть мира не использовалась для него, кроме класса связанного списка.