2016-10-29 2 views
-1

Так что сейчас я пытаюсь реализовать список, используя STL, но я застрял в том, что делать для функции печати. Я искал решения, но у меня есть трудное понимание времени. У меня возникли проблемы с использованием итераторов в этой реализации.C++ создание и печать списка STL (вместо связанного списка)

Вот мой код:

AnyList.h:

class AnyList 
{ 
public: 

    AnyList(); 

    int getNumOfElem() const; 

    void insertFront(int data); 
    void forwardPrint(); 

private: 
    list<int> *ptr; 
}; 

AnyList.cpp:

AnyList::AnyList() 
{ 
    ptr->begin(); //added 
} 

int AnyList::getNumOfElem() const 
{ 
    return static_cast<int>(ptr->size()); 
} 

void AnyList::insertFront(int data) 
{ 
    ptr->push_front(data); 
} 

void AnyList::forwardPrint() 
{ 
    //const list<int> & iter; //removed 
    list<int>::const_iterator i; 
    for (i = ptr->begin(); i != ptr->end(); ++i) //changed 
    { 
     cout << *i << " "; 
     cout << endl; 
    } 
} 

main.cpp

int main() 
{ 
    AnyList list1, list2; 

    list1.insertFront(10); 
    list1.insertFront(11); 
    list1.insertFront(12); 
    list1.insertFront(13); 
    list1.insertFront(14); 


    cout << "\nList 1: "; 
    list1.forwardPrint(); 
} 

Любое понимание было бы весьма признателен , На данный момент я даже не знаю, как проверить, работает ли функция insertFront без функции печати.

Редактировать: внесли некоторые изменения в код и пометили их.

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

enter image description here

Просто повторить - Файл проекта пришел с классом AnyList, который включает в себя частный член списка переменных * PTR и функции getNumOfElements() в качестве примера рабочей функции. В основной файл гораздо больше, но я включил первую часть, которая должна работать, если я правильно реализую функции insertFront и forwardPrint.

Редактировать 3: Для дальнейшего уточнения того, что я считаю, что я запутался, примеры которых я вижу везде идти что-то вроде этого:

vector<string> SS; 

    SS.push_back("The number is 10"); 
    SS.push_back("The number is 20"); 
    SS.push_back("The number is 30"); 

    cout << "Loop by index:" << endl; 

    int ii; 

    for(ii=0; ii < SS.size(); ii++) 
    { 
     cout << SS[ii] << endl; 
    } 

    cout << endl << "Constant Iterator:" << endl; 

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

+2

Почему бы просто не использовать 'std :: list ' вместо 'AnyList'? – juanchopanza

+3

Мое понимание: вам совсем не нужно 'AnyList'. Все, что вам нужно, это функция для печати элементов 'std :: list'. И вы можете обобщить это на тот, который работает с различными типами контейнеров. – juanchopanza

+0

Ну, в основном нам нужно реализовать связанный список как список STL, а класс AnyList уже был предоставлен вместе с функцией getNumOfElem() в качестве примера. Мы должны строить на нем афайк. – BaloneyOs

ответ

1

В функции forwardPrint у вас есть это:

const list<int> & iter; 

Это определяет переменную iter, который не является итератор (независимо от имени), но ссылка на список. Это неверно двумя способами: сначала вы определяете переменную, не имеющую связи с вашим фактическим списком. Во-вторых, вы определяете переменную, которая должна быть ссылкой на список, но без фактической ссылки на что-либо.

Вместо этого следует использовать переменную-член. Так что-то вроде

for (i = ptr->begin(); i != ptr->end(); ++i) { ... } 

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

Не используйте использовать указатель. Вместо этого используйте фактический экземпляр.

Или, как отметили несколько замечаний, зачем вообще обертывать класс std::list?

+0

Если вы имеете в виду переменную частного члена AnyList «список * ptr», это уже было в файле и используется для функции примера getNumOfElem(), которая также была связана с файлом. – BaloneyOs

+0

Также я внес изменения, которые вы предложили, но теперь я получаю нарушение доступа от чтения местоположения. – BaloneyOs

+0

@BaloneyOs Ошибка, вероятно, из-за того, что вы не * инициализируете * указатель, вы не указываете на действительный список. Включены ли инструкции по назначению, чтобы не изменять переменную-член? Потому что это глупо. –

Смежные вопросы