2014-10-29 3 views
1

Я новичок в ubuntu, теперь мне нужно разработать свое назначение на C++. Я использую codeblocks IDE для написания программ на C++. Всякий раз, когда я компилирую что-то в нем, это дает следующие ошибки:Ошибка компилятора GNU GCC «множественное определение main»

multiple definition of main 
warning: control reaches end of non-void function 

Вот код, который я хочу, чтобы скомпилировать сейчас:

#include <iostream> 
#include <stdlib.h> 
using namespace std; 
/* The Node class */ 
class Node 
{ 
    public: 
     int get() { return object; }; 
     void set(int object) { this->object = object; }; 
     Node * getNext() { return nextNode; }; 
     void setNext(Node * nextNode) { this->nextNode = nextNode; }; 
    private: 
     int object; 
     Node * nextNode; 
}; 
/* The List class */ 
class List 
{ 
    public: 
     List(); 
     void add (int addObject); 
     int get(); 
     bool next(); 
     friend void traverse(List list); 
     friend List addNodes(); 

    private: 
     int size; 
     Node * headNode; 
     Node * currentNode; 
     Node * lastCurrentNode; 
}; 
/* Constructor */ 
List::List() 
{ 
    headNode = new Node(); 
    headNode->setNext(NULL); 
    currentNode = NULL; 
    lastCurrentNode = NULL; 
    size = 0; 
} 

/* add() class method */ 
void List::add (int addObject) 
{ 
    Node * newNode = new Node(); 
    newNode->set(addObject); 
    if(currentNode != NULL) 
    { 
     newNode->setNext(currentNode->getNext()); 
     currentNode->setNext(newNode); 
     lastCurrentNode = currentNode; 
     currentNode = newNode; 
    } 
    else 
    { 
     newNode->setNext(NULL); 
     headNode->setNext(newNode); 
     lastCurrentNode = headNode; 
     currentNode = newNode; 
    } 
    size ++; 
} 
/* get() class method */ 
int List::get() 
{ 
    if (currentNode != NULL) 
     return currentNode->get(); 
} 
/* next() class method */ 
bool List::next() 
{ 
    if (currentNode == NULL) return false; 
    lastCurrentNode = currentNode; 
    currentNode = currentNode->getNext(); 
    if (currentNode == NULL || size == 0) 
     return false; 
    else 
     return true; 
} 
/* Friend function to traverse linked list */ 
void traverse(List list) 
{ 
    Node* savedCurrentNode = list.currentNode; 
    list.currentNode = list.headNode; 

    for(int i = 1; list.next(); i++) 
    { 
     cout << "\n Element " << i << " " << list.get(); 
    } 
    list.currentNode = savedCurrentNode; 
} 
/* Friend function to add Nodes into the list */ 
List addNodes() 
{ 
    List list; 
    list.add(2); 
    list.add(6); 
    list.add(8); 
    list.add(7); 
    list.add(1); 
    cout << "\n List size = " << list.size <<'\n'; 
    return list; 
} 
int main() 
{ 
    List list = addNodes(); 
    traverse(list); 
    return 0; 
} 

Может кто-нибудь объяснить, где я Мессинг?

+2

'List :: get()' имеет путь управления, который выходит из функции без возврата значения (т. Е. Когда условие в 'if' является ложным). – Niall

+0

Можете ли вы предоставить нам флаги компилятора/компоновщика. – sfrehse

+0

Опубликуйте свой код, а не ссылку, также функция 'int List :: get()' ничего не вернет, пока не будет выполнено логическое условие, поэтому ошибка – EdChum

ответ

0

Проблема была только моя IDE была компиляция нескольких файлов одновременно, , а также в функции int List::get(), я должен добавить else return -1 в конце этой функции после того, как если заявление,
Я имею в виду, прежде чем редактирование мой код функции int List::get() было так:

int List::get() { 
    if (currentNode != NULL) 
     return currentNode->get(); 
} 

Я заменяет этот с:

int List::get() { 
    if (currentNode != NULL) 
     return currentNode->get(); 
    else return -1; 
} 

и он отлично работал.

3

Кажется, что ваша IDE не просто компилирует один файл, но еще одну, которая также содержит определение основной функции. Посмотрите, сколько файлов компилируется.

Кроме того, ваш скомпилированный обрабатывает все предупреждения как ошибки (-Werror) или отключает этот флаг.

+0

Я просто попытался скомпилировать один файл тоже ... Но он дал ту же ошибку ... – arximughal

+0

Вы можете вернуть -1, если текущий == NULL в int List :: get() –

+0

попробовал, теперь его просто давая сингл ошибка 'multiple definition of main' :( – arximughal

3

Программа компилируется нормально с (yourcode.cc содержит ваш исходный код):

$ CXXFLAGS="-Wall -Werror -Wpedantic" make yourcode 

stack.cc: In member function ‘int List::get()’: 
stack.cc:76:1: error: control reaches end of non-void function [-Wreturn-type] 
} 

и вызова ./yourcode выходы:

List size = 5 

Element 1 2 
Element 2 6 
Element 3 8 
Element 4 7 
Element 5 1 

Очевидно ваш IDE собирается добавить некоторые флаги компоновщика. Пожалуйста, покажите нам свои флагов компиляции/настройки. См. Журнал компиляции или запустите команду make, выполняющую более подробные описания.

Можете взглянуть на. Code::blocks verbose build

+2

-1: Все, что вы делаете здесь, - это обучение OP для важных предупреждений компилятора _ignore_. «Я также не вижу, как это ответ, не говоря уже о 3-м ответе, поскольку вы вообще не обращались к проблеме OP. –

+1

Конечно, но это показывает, что код itse lf в порядке и подразумевает, что что-то не так со средой сборки. – sfrehse

+0

Но код _not_ okay. Было предупреждение, указывающее на это. Вы решили проигнорировать его и научили OP игнорировать его. Зачем? –

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