2015-02-26 3 views
1

Вот мой класс, который находится в заголовке.Я получаю неопределенную ссылку на ошибку vtable

class AlarmPatterns 
{ 
public: 
    AlarmPatterns() {} 

    virtual~AlarmPatterns(); 

    //alarm patterns 
    enum class PATTERN_TYPES_E 
    { 
     BEEP_MODE,  //150 
     IGN_BULBCHECK, //160 
     LOW_PRIO_REMIND, //170 
     DM1_RED,   //200 
     HP_ALERT_5,  //210 
     HP_ALERT_4,  //220 
     HP_ALERT_3,  //230 
     HP_ALERT_2,  //240 
     HP_ALERT_1,  //250 
     NUM_PATTERNS 
    }; 

    static bool LoadPatternData(AP_S & pattern, const uint8_t id); 

    static const AP_S Patterns[]; 
}; 

AP_S является ЬурейеЙ структурой в том же пространстве имен, но вне класса

Это базовый класс, так как мы не вытекающие из других классов

В моем test.cpp файл I есть:

AlarmPatterns * TestPattern; 

void setup() 
{ 
    TestPattern = new AlarmPatterns(); 
} 

Комментируя TestPattern = new AlarmPatterns(); результаты без каких-либо ошибок

Здесь ошибка

undefined reference to `vtable for Dragonfly::Alarm::AlarmPatterns' 

Поскольку нет никакого способа, я пропускаю виртуальные функции из любых базовых классов, я не вижу, как я получаю эту ошибку.

+0

Возможно, вы не ссылаетесь на код для AlarmPatterns – thang

+0

Возможный дубликат [Неопределенные символы «vtable for ...» и «typeinfo for ...»?] (Http://stackoverflow.com/questions/1693634/undefined-symbols-vtable-for-and-typeinfo-for) Есть сотни подобных вопросов, просто отбросьте сообщение об ошибке в какой-то поисковой системе. В следующий раз, пожалуйста, сначала сделайте исследование. –

ответ

1

Вы отправите декларацию деструктора, но вы не даете определения.

Если вы хотите пустой деструктор, потому что это означало бы базовый класс с другими виртуальными методами просто объявить пустой деструктор:

virtual ~AlarmPatterns() {} // Note the braces 
0

Это происходит, когда вы теряете определение первой виртуальной функции ,

В вашем случае его ~AlarmPatterns() .. добавьте реализацию этого и все должно просто работать.