Линкер жалуется на неопределенную ссылку на vtable - PullRequest
0 голосов
/ 05 октября 2011

У меня есть этот код в моем fileType.h.

class FileType{
    private:
        School* m_school;
        string m_fileFormat;
        const string m_cfgFile;
        const string m_inputFile;

    public:
        FileType(string p_fileFormat, string p_cfgFile, string p_inputFile):
                 m_fileFormat(p_fileFormat), m_cfgFile(p_cfgFile), m_inputFile(p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 12 digit in the ID etc
        virtual ~FileType();
};

class XmlType:public FileType{

    public:
        XmlType(string p_fileFormat, string p_cfgFile, string p_inputFile):
            FileType(p_fileFormat, p_cfgFile, p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 11 digit in the ID etc

};


class CsvType:public FileType{

    public:
        CsvType(string p_fileFormat, string p_cfgFile, string p_inputFile):
            FileType(p_fileFormat, p_cfgFile, p_inputFile) {};
        virtual bool parseInputFile();
        virtual bool writeOutputFile(const School& m_school);
        virtual bool checkFormat(); // TBD -- used to check the format of the input file
        virtual bool checkConstraints(); // TBD -- used to check things like only +ve 11 digit in the ID etc

};

В моем основном я вставил:

#include "fileType.h"

    FileType *inputFilePtr, *outputFilePtr;
    string stringOne, stringTwo, stringThree;
    inputFilePtr = new CsvType(stringOne, stringTwo, stringThree);

Теперь мой компоновщик говорит мне, чтоЯ не знаю символов для конструкторов:

/ cygdrive / c / Users / Владелец / AppData / Local / Temp / cclieUAi.o: main.cpp :(. Text $ _ZN7CsvTypeC1ESsSsSs [CsvType :: CsvType (std :: basic_string, std :: allocator>, std :: basic_string, std :: allocator>, std :: basic_string, std :: allocator>)] + 0x1bf): неопределенная ссылка на vtable for CsvType' /cygdrive/c/Users/Owner/AppData/Local/Temp/cclieUAi.o:main.cpp:(.text$_ZN8FileTypeC2ESsSsSs[FileType::FileType(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x3a): undefined reference to vtable для FileType 'collect2:ld вернул 1 состояние выхода

Я попытался создать фиктивный конструктор с двумя целыми числами и ничего не делать.Это сработало, но как только я положил строки, это не удалось.Есть идеи, что не так?

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Вы определили только конструкторы, но не определили виртуальные функции. Только объявить их недостаточно. Вы также должны определить их, что означает, что функция должна иметь тело-функцию, содержащее некоторые операторы (хотя оно также может быть пустым).

//file.h
class A
{ 
   virtual void f(); //this is called declaration
};

//file.cpp
void A::f() //this is called definition
{
  //this is called function-body.
}
0 голосов
/ 05 октября 2011

вы объявили виртуальный деструктор, но у ваших подклассов его нет!

где virtual ~CsvType() { } и virtual ~XmlType() {}

если это абстрактный базовый класс, вы можете установить чисто виртуальные функции FileTypeto с помощью virtual bool parseInputFile() = 0;, чтобы вы не могли создать объект FileType.

Также после virtual bool parseInputFile() {} вам не требуется ;

...