Я получаю ошибку NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. "vtable for Algorithm2A"
. Я предполагаю, что проблема в моем базовом классе я объявила эту функцию как чистую виртуальную, а затем в заголовке .h
производного класса I обновила его, чтобы иметь возможность реализовать его в файле реализации .cpp
.Отсутствует vtable: должна ли отображаться виртуальная функция в заголовочном файле?
IAlgorithm2.h - это мой абстрактный класс
#include "IAlgorithm1.h"
//! Algorithm2 interface
class IAlgorithm2 {
public:
~IAlgorithm2() {
}
virtual std::vector<int> calculateLCP(std::string BWT)=0;
};
Теперь у меня есть реализация этого в Algorithm2.h
и Algorithm2.cpp
.
Algorithm2A.hpp
class Algorithm2A : public IAlgorithm2 {
protected:
IAlgorithm1 &algorithm1;
std::vector<Interval> getIntervals(int i, int j) {
return algorithm1.getIntervals(i, j);
}
public:
Algorithm2A(IAlgorithm1 &a) : algorithm1(a) {
}
std::vector<int> calculateLCP(std::string BWT);
};
Algorithm2A.cpp
#include "Algorithm2A.hpp"
std::vector<int> Algorithm2A::calculateLCP(std::string BWT) {
// implementation of this
}
Как это должно быть сделано? Если я удалю определение из Algorithm2A.h
, которое он не будет компилировать, и если я оставлю его там, то есть проблема с vtable.
редактировать: это не вопрос шаблонов
IAlgorithm1.h
//! Algorithm1 interface
class IAlgorithm1 {
protected:
virtual std::string uniqueCharsInInterval(int i, int j)=0;
public:
~IAlgorithm1() {
}
virtual std::vector<Interval> getIntervals(int i, int j)=0;
};
#endif /* Algorithm1_h */
Algorithm1A.h
#include "IAlgorithm1.h"
class Algorithm1A : public IAlgorithm1 {
protected:
IRank &rank;
OrderedAlphabet &alphabet;
std::map<symbol_type, occurence_type> &C;
std::string &BWT;
public:
Algorithm1A(IRank &r,
OrderedAlphabet &a,
std::map<symbol_type, occurence_type> &c,
std::string &bwt):
rank(r), alphabet(a), C(c), BWT(bwt) {
}
std::string uniqueCharsInInterval(int i, int j);
Существует также файл реализации Algorithm1A.cpp
Вам нужно повторить объявление функции в 'Algorithm2A'. Что такое проблема vtable? Любые сообщения об ошибках? Обратите внимание, что файл заголовка называется 'Algorithm2A.h', но вы' #include '. Обратите внимание на 'pp' в конце. –
BoBTFish
неопределенные символы для архитектуры x86_64: "Algorithm2A :: ~ Algorithm2A()", ссылочные от: _MAIN в главном-ccca0a.o "для Algorithm1A виртуальные таблицы", ссылочные от: _MAIN в главном-ccca0a.o, и там является ПРИМЕЧАНИЕ. Я отредактирую и дам также код алгоритма1A. – Whizzil
Как вы его строите? Похоже, вы все не связали. –