I have a C++ code, where I'm trying to use inheritance to reuse my code. But when I make the code I get the following error:
Undefined symbols for architecture x86_64: "QuickUnion::QuickUnion(int)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [a.out] Error 1
My Makefile:
CC = g++
CFLAGS = -std=c++11 -Wall -c
LFLAGS = -std=c++11 -Wall
DEBUG = -g
OBJS = main.o unionfind/UnionFind.o unionfind/QuickUnion.o
a.out: $(OBJS)
$(CC) $(LFLAGS) $(OBJS) $(DEBUG)
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp $(DEBUG)
unionfind/QuickUnion.o: unionfind/UnionFind.h unionfind/QuickUnion.h unionfind/QuickUnion.cpp
$(CC) $(CFLAGS) unionfind/QuickUnion.cpp $(DEBUG)
unionfind/UnionFind.o: unionfind/UnionFind.h unionfind/UnionFind.cpp
$(CC) $(CFLAGS) unionfind/UnionFind.cpp $(DEBUG)
The UnionFind .h and .cpp:
#ifndef UNIONFIND_H
#define UNIONFIND_H
#include <vector>
class UnionFind {
protected:
int connectedComponents;
std::vector<int> parents;
public:
UnionFind(int);
virtual void connect(int, int) = 0;
virtual int find(int) = 0;
bool connected(int, int);
int count();
};
#endif
...
#include "UnionFind.h"
UnionFind::UnionFind(int size): parents(size) {
connectedComponents = size;
for (int i = 0; i < size; i++) {
parents[i] = i;
}
}
bool UnionFind::connected(int p, int q) {
return find(p) == find(q);
}
int UnionFind::count() {
return connectedComponents;
}
The QuickUnion .h and .cpp:
#ifndef QUICKUNION_H
#define QUICKUNION_H
#include <vector>
#include "UnionFind.h"
class QuickUnion: public UnionFind {
public:
QuickUnion(int);
void connect(int, int);
int find(int);
};
#endif
...
#include "QuickUnion.h"
QuickUnion::QuickUnion(int size): UnionFind(size) {
}
void QuickUnion::connect(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) {
return;
}
parents[pRoot] = qRoot;
connectedComponents--;
}
int QuickUnion::find(int p) {
while (p != parents[p]) {
p = parents[p];
}
return p;
}
Maybe there is something to do with the constructor, but I don't know neither why this error is happening nor how to correct it.
PS.: I am using OS X El Capitan.
Aucun commentaire:
Enregistrer un commentaire