Проблема компиляции со static
От: INsideR Латвия  
Дата: 23.07.03 16:35
Оценка:
#include <list>

class CBaseObject
{
private:
    static std::list<CBaseObject *> liveObjects;
    long nRefCount;
protected:
    CBaseObject();
    virtual ~CBaseObject();

};

CBaseObject::CBaseObject()
{
    liveObjects.push_back(this);
    nRefCount = 0;
};

CBaseObject::~CBaseObject()
{
};


Почему не компилируется этот код? Выдаёт такую ошибку

MemoryManager error LNK2001: unresolved external symbol "private: static class _STL::list<class CBaseObject *,class _STL::allocator<class CBaseObject *> > CBaseObject::liveObjects" (?liveObjects@CBaseObject@@0V?$list@PAVCBaseObject@@V?$allocator@PAVCBaseObject@@@_STL@@@_STL@@A)

Пользуюсь STLPort, и VC 7.0
Мудр тот, кто знает не многое, а нужное
Re: Проблема компиляции со static
От: Lorenzo_LAMAS  
Дата: 23.07.03 16:38
Оценка:
Помимо объявления в классе, статический член еще и определить надо.

//a.h
class A
{
   static int i_;
};
//a.cpp
int A::i_;
Of course, the code must be complete enough to compile and link.
Re: Проблема компиляции со static
От: Russov Украина  
Дата: 24.07.03 06:20
Оценка:
Здравствуйте, INsideR, Вы писали:


INR>
INR>#include <list>

INR>class CBaseObject
INR>{
INR>private:
INR>    static std::list<CBaseObject *> liveObjects;
INR>    long nRefCount;
INR>protected:
INR>    CBaseObject();
INR>    virtual ~CBaseObject();

INR>};

INR>CBaseObject::CBaseObject()
INR>{
INR>    liveObjects.push_back(this);
INR>    nRefCount = 0;
INR>};

INR>CBaseObject::~CBaseObject()
INR>{
INR>};
INR>


INR>Почему не компилируется этот код? Выдаёт такую ошибку


INR>MemoryManager error LNK2001: unresolved external symbol "private: static class _STL::list<class CBaseObject *,class _STL::allocator<class CBaseObject *> > CBaseObject::liveObjects" (?liveObjects@CBaseObject@@0V?$list@PAVCBaseObject@@V?$allocator@PAVCBaseObject@@@_STL@@@_STL@@A)


INR>Пользуюсь STLPort, и VC 7.0



Для определения (и инициализации) статической переменной в реализацию класса вставьте такую строку:
std::list<CBaseObject *> CBaseObject::liveObjects;


В итоге получится что-то вроде:


#include <list>

class CBaseObject
{
private:
    static std::list<CBaseObject *> liveObjects;
    long nRefCount;
protected:
    CBaseObject();
    virtual ~CBaseObject();

};

CBaseObject::CBaseObject()
{
    liveObjects.push_back(this);
    nRefCount = 0;
};

CBaseObject::~CBaseObject()
{
};

std::list<CBaseObject *> CBaseObject::liveObjects;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.