2015-04-06 4 views
1

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

Я пытаюсь связать файлы .cpp и .h в файле main.cpp, чтобы он работал там. Но я получаю множественное определение каждой функции внутри моего файла cpp, что в причинах «ld возвратил 1 статус выхода»

Чем больше функций я добавляю, тем больше ошибок я получаю.

Вот мой код:

binaryHeap.h:

#ifndef Binary_H 
#define Binary_H 

#include <vector> 

class BinaryHeap{ 
    private: 
     std::vector <int> heap; 
     int left(int parent); 
     int right(int parent); 
     void heapifyUp(int index); 
     void heapifyDown(int index); 
    public: 
     BinaryHeap(); //Constructor 
     void insert(int element); //inserts element into heap 
     void deleteMin(); // deletes minimum element 
     int extractMin(); 
     void displayHeap(); 
     int size(); 
}; 

#endif //Binary_H 

binaryHeap.cpp:

#include <iostream> 
#include "binaryHeap.h" 

BinaryHeap::BinaryHeap(){ 
} 

void BinaryHeap::heapifyUp(int index){ 
    int parent = (index - 1)/2; 

    if(index != 0 && parent >= 0 && heap[parent] > heap[index]){ 
     int temp = heap[index]; 
     heap[index] = heap[parent]; 
     heap[parent] = temp; 
     heapifyUp(parent); 
    } 
} 



void BinaryHeap::insert(int element){ 
    heap.push_back(element); 
    heapifyUp(heap.size() - 1); 
} 



void BinaryHeap::displayHeap(){ 
    std::vector<int>::iterator pos = heap.begin(); 
    while (pos != heap.end()){ 
     std::cout << *pos << std::endl; 
     pos++; 
    } 
} 

main.cpp:

#include "binaryHeap.cpp" 

int main(int argc, char* argv[]) { 
    BinaryHeap h; 
    h.insert(5); 
    h.insert(2); 
    h.insert(19); 

    return 0; 
} 

А вот ошибки:

main.o:main.cpp:(.text+0x0): multiple definition of `BinaryHeap::BinaryHeap()' 
binaryHeap.o:binaryHeap.cpp:(.text+0x0): first defined here 
main.o:main.cpp:(.text+0x0): multiple definition of `BinaryHeap::BinaryHeap()' 
binaryHeap.o:binaryHeap.cpp:(.text+0x0): first defined here 
main.o:main.cpp:(.text+0x20): multiple definition of `BinaryHeap::heapifyUp(int)' 
binaryHeap.o:binaryHeap.cpp:(.text+0x20): first defined here 
main.o:main.cpp:(.text+0xfe): multiple definition of `BinaryHeap::insert(int)' 
binaryHeap.o:binaryHeap.cpp:(.text+0xfe): first defined here 
main.o:main.cpp:(.text+0x13e): multiple definition of `BinaryHeap::displayHeap()' 
binaryHeap.o:binaryHeap.cpp:(.text+0x13e): first defined here 
c:/program files (x86)/dev-cpp/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld.exe: binaryHeap.o: bad reloc address 0x0 in section `.pdata$_ZnwyPv' 
collect2.exe: error: ld returned 1 exit status 

C:\Users\~\Desktop\Coding Training\Binary Heap\Makefile.win:25: recipe for target '"Binary' failed 
mingw32-make.exe: *** ["Binary] Error 1 
+0

Вы никогда не должны включать файл '.cpp'. В 'main.cpp', измените include на' binaryHeap.h' – CinCout

ответ

0

Продолжая мой комментарий, вы никогда не должны включать файл .cpp в любом другом файле. То, что #include делает, копирует все содержимое из включенного файла в место, где вы его включаете. Это означает, что содержимое binaryHeap.cpp скомпилировано дважды в вашем коде. И об этом говорят вам ошибки.

Для устранения неполадок в вашем случае - в main.cpp, смените их на binaryHeap.h.

EDIT: Добавление больше объяснений:

включаемой директиву просто копирует и вставляет источник файла в этом месте. Итак, если вы включили binaryHeap.cpp в main.cpp, источник binabyHeap фактически скомпилирован дважды. И, как только компоновщик начинает комбинировать ваши объектные файлы, он выбирает несколько определений того, что у вас было в binaryHeap.cpp, и вызывает несколько ошибок.

+0

Вы говорите, что содержимое binaryHeap.cpp скомпилировано дважды. Но я не понимаю, почему. Это так? 'main.cpp -> содержит binaryHeap.h -> copy binaryHeap.cpp (так как binaryHeap.cpp включает binaryHeap.h)? – Homerdough

+0

@Homerdough Нет, это потому, что вы включили файл ** cpp ** файла binaryHeap в main.c вместо ** h ** – jerry

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