这可能有2秒的解决方案,但我一直试图弄清楚过去一小时,这让我发疯。
我正在尝试将.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):多重定义
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): 首先在这里定义main.o:main.cpp :(。text + 0x20):多重定义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): 首先在这里定义main.o:main.cpp :(。text + 0x13e):多重定义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:错误:ld返回1退出状态C:\ Users \〜\ Desktop \ Coding Training \ Binary Heap \ Makefile.win:25: recipe 目标'“二进制”失败mingw32-make.exe:*** [“二进制]错误1
答案 0 :(得分:2)
扩展我的评论,您绝不能在任何其他文件中包含.cpp
文件。 #include
所做的是将包含文件中的所有内容复制到您包含它的位置。这意味着binaryHeap.cpp
的内容在您的代码中编译两次。这就是错误告诉你的。
要解决您的案例中的错误 - 在main.cpp
中,请将包含更改为binaryHeap.h
。
编辑:添加更多解释:
include指令只是将文件源复制并粘贴到该位置。因此,如果您在binaryHeap.cpp
中包含main.cpp
,则binabyHeap
的来源实际上会被编译两次。并且,一旦链接器开始组合您的目标文件,它就会获取binaryHeap.cpp
中所有内容的多个定义,并引发一些错误。