2010-05-26 2 views
2

У меня есть этот класс, который имеет статический член. это также базовый класс для нескольких других классов в моей программе. Вот его заголовочный файл:undefined ссылка на переменную статического члена

#ifndef YARL_OBJECT_HPP 
#define YARL_OBJECT_HPP 

namespace yarlObject 
{ 
    class YarlObject 
    { 
    // Member Variables 
     private: 
      static int nextID; // keeps track of the next ID number to be used 
      int ID; // the identifier for a specific object 

    // Member Functions 
     public: 
      YarlObject(): ID(++nextID) {} 
      virtual ~YarlObject() {} 

      int getID() const {return ID;} 

    }; 
} 

#endif 

и вот его файл реализации.

#include "YarlObject.hpp" 

namespace yarlObject 
{ 
    int YarlObject::nextID = 0; 
} 

Я использую G ++, и он возвращает три undefined reference to 'yarlObject::YarlObject::nextID ошибки компоновщика. Если я изменяю фразу ++nextID в конструкторе только nextID, тогда я получаю только одну ошибку, и если я ее поменяю на 1, тогда она правильно свяжется. Я думаю, что это что-то простое, но что происходит?

+0

99.9% уверен, потому что он правильно связывается, когда я меняю '++ nextID' на' 1'. – Max

+1

, если вы не ссылаетесь на 'nextID', тогда вам не нужно его определять. Так что это не показатель наличия этого определения в финальном исполняемом файле. Фактически, тот факт, что он работает, указывает на то, что вы * не пропустите ссылку на файл реализации. –

ответ

1

Убедитесь в том, что вы используете ссылку на созданный файл .o. Дважды проверьте make-файл.

+0

Это исправлено. Благодарю. – Max

+1

Почему это должно иметь значение? Я получил те же ошибки, что и @Max, если я не ссылался на файл YarlObject.o, и все они ушли, когда я связал его (с встроенным конструктором). – Troubadour

+0

-1: Хотя это, возможно, устранило проблему для @Max, это, безусловно, не по той причине, о которой вы заявляете. – Troubadour

Смежные вопросы