2013-09-19 6 views
1

Я определил свой struct в файле .h, и я пытаюсь получить к нему доступ из файла .cc. Тем не менее, я продолжаю получать ошибки при компиляции.C++ Access struct в исходном файле

Это в моем .h:

class List 
{ 
public: 
    struct ListNode 
    { 
    string data; 
    ListNode* next; 
    }; 
} 

И это в моем .cc файл: (.h файл включен)

struct ListNode* startPtr; 

List::List(void) 
{ 
    startPtr = new ListNode; 
    startPtr = nullptr; 
} 

При попытке использовать его, как это,

void Print() 
{ 
while (startPtr) 
    { 
    cout << startPtr->data << endl; 
    startPtr = startPtr->next; 
    } 
} 

я получаю сообщение об ошибке, как

Forward declaration and unauthorized usage of undefined type. 
+2

много ответов, но по другому вопросу, имея глобальную переменную startPtr совершенно неправильно. Список должен быть самостоятельным классом, он не должен полагаться на какие-либо глобальные переменные. И методы печати, и конструктор списка тоже выглядят неправильно. – john

ответ

3

Вы должны include файл .h в файле .cc И, как ListNode определяется внутри class List, если вы хотите получить доступ к нему из-за пределов класса (за пределами его определения & свои методы), вам необходимо указать область как это List::ListNode.

Обратите внимание, что если class List определяются внутри определенного пространства имен, например my_namespace, если вы хотите получить доступ к ListNode из глобального пространства имен, вам необходимости указать это тоже. Вроде: my_namespace::List::ListNode.

+0

Вы должны использовать 'List :: ListNode' в объявлении глобальной переменной. Нет необходимости использовать «List :: ListNode» в конструкторе «List» или любом другом методе «Список». – john

+0

Да, конечно. Я думал об упоминании этого, но я этого не сделал, поскольку для этого также нужна еще одна «спецификация» - «глобальное пространство имен» - что, если «класс List» не находится в глобальном пространстве имен? Я знаю, что вы имеете в виду, я добавлю это в свой ответ, просто заметив. –

0

Ваш класс узлов списка является внутренним классом. Это тип: List::ListNode не только ListNode, как вы его используете.

Также как вы указываете форвардную декларацию (хотя я не вижу в этом коде): вы не сможете переслать объявление внутреннего класса.

0

Вы сделали ListNode вложенным типом List, поэтому вы должны называть его List::ListNode. Вы можете оставить struct, когда вы объявляете startPtr.

Конечно, поскольку List::ListNode является излишним, вы можете переименовать его только в Node.

0
  • включает .h файл в файле .cc
  • относится к структуре, как List::ListNode как это вложенный тип
  • не должен писать struct ListNode* startPtr; только List::ListNode* startPtr;
  • вставки с запятой после класса List определение в .h файле
0

Позвольте мне перефразировать ответ Кирил Кирова. У вас есть 2 типа в вашей программе: - ListNode, определенный в области класса List - ListNode, определенный в глобальной области видимости Второй определяется с помощью прямого объявления без фактического описания его содержимого. Это ваш компилятор пытается сказать вам. Чтобы исправить ошибку, вам нужно указать правильный тип ListNode при определении startPtr, например. Вы должны написать:

List::ListNode* startPtr; 

вместо

struct ListNode* startPtr; 
Смежные вопросы