Ошибка компоновщика XCode, простые функции C ++ - PullRequest
0 голосов
/ 06 марта 2012

У меня есть программа на xcode, и она отлично работает только со скелетом. Я пошел, чтобы добавить некоторый код, и когда я добавил три функции, все частные, две из которых встроены как в .h, так и в .cpp. Когда я пошел на компиляцию, я получил ошибки компоновщика, потому что бог знает, по какой причине. Класс, в котором я создаю функции, также наследуется от структуры, но я не думаю, что это должно быть проблемой. Я выложу код ниже. (в этом проекте много чего, поэтому я не могу опубликовать все)

#ifndef HEAP_SORT_H
#define HEAP_SORT_H

#include "Interfaces02.h"
#include "CountedInteger.h"

class HeapSort : public IHeapSort {
public:
HeapSort();
virtual ~HeapSort();
virtual void buildHeap(std::vector<CountedInteger>& vector);
virtual void sortHeap(std::vector<CountedInteger>& vector);
private:
virtual unsigned int l(int i);
virtual unsigned int r(int i);
virtual void fixDown(std::vector<CountedInteger>& vector, int p);
};

#endif


#include "HeapSort.h"
#include "CountedInteger.h"

HeapSort::HeapSort()
{
}

HeapSort::~HeapSort()
{
}

void HeapSort::buildHeap(std::vector<CountedInteger>& vector)
{    

int i = ((int) vector.size()) - 1;
for(; i > 1; i--)
{
    fixDown(vector, i);
}


}

void HeapSort::sortHeap(std::vector<CountedInteger>& vector)
{
}

inline unsigned int l(int i)
{
return ((i*2)+1);
}

inline unsigned int r(int i)
{
   return ((i*2)+2);
}

void fixDown(std::vector<CountedInteger>& vector, int p)
{

int largest;

if(l(p) <= vector.size() && vector[l(p)] > vector[p])
   {
       largest = l(p);
   }
   else
   {
       largest = p;
   }
if(r(p) <= vector.size() && vector[r(p)] > vector[p])
   {
       largest = r(p);
   }
if(largest != p)
{
    CountedInteger temp = vector[largest];
    vector[largest] = vector[p];
    vector[p] = temp;
    fixDown(vector, largest);
}


}

и вот ошибка, которую он мне дает:

Undefined symbols for architecture x86_64:
"HeapSort::l(int)", referenced from:
vtable for HeapSort in HeapSort.o
  "HeapSort::r(int)", referenced from:
  vtable for HeapSort in HeapSort.o
  "HeapSort::fixDown(std::vector<CountedInteger,std::allocator<CountedInteger>>&,int)", 
 referenced from:
  vtable for HeapSort in HeapSort.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1 Ответ

3 голосов
/ 06 марта 2012

Вы не реализуете:

virtual unsigned int l(int i);
virtual unsigned int r(int i);
virtual void fixDown(std::vector<CountedInteger>& vector, int p);

Вы забыли указать эти методы в файле реализации.

inline unsigned int l(int i)

не совпадает с

inline unsigned int HeapSort::l(int i)

Как и сейчас, это просто свободные функции, определенные в этом модуле перевода.

...