Элем не называет тип? - PullRequest
       8

Элем не называет тип?

1 голос
/ 27 марта 2012

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

Я создаю структуру данных связанного списка, и я сделал две функцииодин для возвращения переднего элемента и один для возврата последнего элемента.Проблема в том, что компилятор говорит, что Elem не определяет тип, когда он это делает.

Вот заголовочный файл, урезанный до соответствующего кода:

class simpleList {

    public:
        //Returns a pointer to the first Elem of the list
        simpleList::Elem* front();

        //Returns a pointer to the last Elem of the list
        simpleList::Elem* back();

    private:
        struct Elem {
            char info;
            Elem *next;
        };

        Elem *head; 
};

и вотреализация этих двух функций в файле .cpp:

//Returns a pointer to the first Elem of the list
simpleList::Elem* simpleList::front()
{
    return head;
}

//Returns a pointer to the last Elem of the list
simpleList::Elem* simpleList::back()
{
    Elem * temp = head;

    while( temp -> next != 0 )
        temp = temp -> next;

    return temp;
}

Я пробовал как определить область видимости для класса, так и просто:

Elem* simpleList::front()
Elem* simpleList::back()

Сообщение об ошибке выглядит следующим образом: simpleList.h: 38: 9: ошибка: «Элемент» в «классе simpleList» не называет тип simpleList.h: 41: 9: ошибка: «Элемент» в «классе simpleList» не называет тип

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Попробуйте этот порядок для объявления класса:

class simpleList {
    public:

        struct Elem {
            char info;
            Elem *next;
        };

        //Returns a pointer to the first Elem of the list
        Elem* front();

        //Returns a pointer to the last Elem of the list
        Elem* back();

    private:
        Elem *head; 

};
0 голосов
/ 27 марта 2012

Для введенного вами кода я получаю гораздо больше ошибок: http://ideone.com/c9PHc

Вот подробности, что не так и почему ответ Бо работает.

  1. Порядок неправильный, поэтому вы использовали тип Elem еще до того, как определили его.Вы должны по крайней мере сообщить компилятору, что он существует и что это вложенный тип для вашего класса.Иначе он доберется до этой точки и не будет знать, что с ним делать.

  2. Ваш struct Elem является личным.Т.е. этот тип можно увидеть только в закрытых частях одного и того же класса, как и в приватной переменной.Вы возвращаете эту структуру из открытого метода, поэтому возвращаемое значение является открытой частью, где эту структуру невозможно увидеть.Изменение только порядка, но не одновременное раскрытие типа означает, что вы можете вызывать simpleList::front() и simpleList::back(), но нигде не хранить тип возврата (так как для этого потребуется переменная с закрытым типом).

  3. В декларации возвращаемого значения есть повторяющиеся спецификаторы области.Это не ошибка, но они на самом деле не нужны и могут сбить с толку других.Обычно на уровне класса вы просто используете вложенные типы напрямую без дополнительных спецификаторов области видимости.

Таким образом, в данном случае важен не только порядок, но и фактическая комбинация ошибок.Счет 1 вызывает ошибку компилятора, которую вы видите, счет 2 приведет к невозможности использования ваших методов и может вызвать ошибки компиляции в других местах, а счет 3 - просто эстетика.

...