2015-09-20 2 views
0

У меня есть следующие файлы cpp и h-файл. Это были примеры, данные нам инструктором, но они не хотят компилироваться. Я получаю эту ошибку:Ошибка компиляции связанного списка C++

linked_list.cpp:50:6: error: prototype for ‘void  LinkedList::remove(LinkedListNode*, int*)’ does not match any in class  ‘LinkedList’ 
void LinkedList::remove(LinkedListNode *node, int *return_value) { 
    ^
In file included from linked_list.cpp:1:0: 
linked_list.h:31:7: error: candidate is: void  LinkedList::remove(LinkedListNode*) 
    void remove(LinkedListNode *node); 
    ^

здесь код:

#include "linked_list.h" 

LinkedList::LinkedList() { 
    this->start = NULL; 
    this->end = NULL; 
} 

LinkedList::~LinkedList() { 
    LinkedListNode *current = this->start; 
    while (current != NULL) { 
     LinkedListNode *temp = current; 
     current = current->next; 
     delete temp; 
    } 
} 

void LinkedList::push(int val) { 
    LinkedListNode *new_node = new LinkedListNode(); 
    new_node->value = val; 
    new_node->next = NULL; 
    new_node->prev = this->end; 

    if (this->end != NULL) { 
     this->end->next = new_node; 
    } else { 
     this->start = new_node; 
    } 

    this->end = new_node; 
} 

int LinkedList::peek() { 
    if (this->end != NULL) { 
     return this->end->value; 
    } 

    return -1; 
} 

int LinkedList::pop() { 
    if (this->end != NULL) { 
     int val = this->end->value; 
     remove(this->end); 
     return val; 
    } 

    return -1; 
} 

void LinkedList::remove(LinkedListNode *node, int *return_value) { 
    if (this->start == node) { 
     this->start = node->next; 
    } else if (node->prev != NULL) { 
     node->prev->next = node->next; 
    } 

    if (this->end == node) { 
     this->end = node->prev; 
    } else if (node->next != NULL) { 
     node->next->prev = node->prev; 
    } 

    delete node; 
} 

Вот заголовочный файл:

#include <cstdlib> 
using namespace std; 

struct LinkedListNode 
{ 
    LinkedListNode *prev; 
    LinkedListNode *next; 
    int value; 
}; 

class LinkedList 
{ 
public: 
    LinkedList(); 
    ~LinkedList(); 

    void push(int val); 
    bool insert_at(int val, int idx); 

    int peek(); 
    int pop(); 
    int retrieve_at(int idx); 
    bool remove_at(int idx); 

    LinkedListNode *find(int val); 

private: 
    LinkedListNode *start; 
    LinkedListNode *end; 

    void remove(LinkedListNode *node); 
}; 

здесь главный файл:

#include <cstdlib> 
#include <iostream> 
#include "linked_list.h" 
using namespace std; 

int main() 
{ 
    LinkedList list; 
    list.push(5); 

    cout << list.peek() << endl; 
    cout << list.pop() << endl; 
    cout << list.pop() << endl; 

    return 0; 
} 
+0

'void remove (LinkedListNode * node);' в вашем заголовке не соответствует 'void LinkedList :: remove (LinkedListNode * node, int * return_value) {' в вашем коде. – Amit

+1

Какая часть сообщения об ошибке неясна? Вы объявляете 'remove' для принятия одного параметра, но вы пытаетесь реализовать его как взятие двух параметров. –

+0

@IgorTandetnik Я не уверен, что это должен быть ответ, или мы просто должны закрыть этот вопрос для тривиальной ошибки. –

ответ

2

Это действительно легко. Если бы вы просто ad ошибки, вы могли видеть, что не так, это даже говорит вам где. Посмотрите заголовочный файл, в котором объявлена ​​функция remove. Затем просмотрите файл cpp, где определена функция remove. Вы должны увидеть, что когда функция объявляется, она имеет еще один параметр типа int *, называемый return_value. Этот параметр отсутствует при определении функции. Вам просто нужно добавить параметр к определению в файле CPP (или удалить его из объявления)

2

Для этой ошибки,

linked_list.cpp:50:6: error: prototype for ‘void
LinkedList::remove(LinkedListNode*, int*)’ does not match any in class ‘LinkedList’ void LinkedList::remove(LinkedListNode *node, int *return_value) {

проблема в том, что функция удалить, которая определена в. cpp (code) не соответствует ни одной из функций, объявленных в заголовке (файл .h). Для того, чтобы исправить, изменить функцию Снимать в заголовке (.h файл) к следующему:

// void remove(LinkedListNode *node); // Wrong 
    void remove(LinkedListNode *node, int*); 

И в файле .cpp, измените функцию поп() в:

int LinkedList::pop() { 
    if (this->end != NULL) { 
//  int val = this->end->value; // Wrong 
//  remove(this->end); // Wrong 
     int val; // new 
     remove(this->end, &val); // new 

Следующая ошибка компиляции жалуется на одни и те же проблемы, но по-другому. Он жалуется, что функция удаления, объявленная в заголовке, не имеет определения, что имеет смысл, потому что они не совпадают. Таким образом, исправление, которое уже сделано, исправит как ошибки компиляции.

+0

Спасибо за помощь. Все, что мне действительно нужно было, это соответствовать параметрам. Я все еще получал ошибки после исправления параметров, но не из-за кода. Я получал ошибки, потому что я скомбинировал их с помощью терминала. Я использую gcc/g ++ в linux. Моя проблема заключалась в том, что я не связывал объектные файлы с основным файлом. Вот почему он не работал. Я исследовал его и понял, как это сделать.Извините за этот вопрос, но я новичок в C++. Пока мне нравится JAVA лучше. – lrod408

+0

Я рад, что вы это поняли. Будет лучше! :) – Dko

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