原因:因为静态成员函数在类对象构造时没有分配this指针(非静态成员函数则具有this指针),相当于是全局函数,是属于类的,而类的成员变量只有类对象(实例)能够访问,成员变量只有实例化才有意义。
解决办法:静态成员函数增加一个类的指针或引用作为参数。如
class Foo
{
int m_f;
public:
static void f()
{
m_f=666; //这是非法的,这个等价于this->m_f=666,而静态方法没有this
}
static void f(Foo&a)
{
a.m_f=666; //这样就可以
}
};
调用静态成员函数无需传入对象指针的办法
通过map保存类对象
typedef map<int,A*> CAMAP;
class A()
{
public:
static void func(); //静态成员函数
private:
int m_ID; //本对象在列表中的ID号
static CAMAP m_Map; //对象映射表,静态
float value; //非静态成员变量
float func1(); //非静态成员函数
};
CAMap A::m_Map; //默认构造map
A::A() //将对象保存至m_Map中
{
if(m_Map.IsEmpty())
{
m_ID=0;
}
else
{
m_ID=m_Map.size()+1;
}
m_Map.insert(make_pair<int,A*>(m_ID,this));
}
A::~A() //将对象从m_Map中删除
{
m_Map.erase(m_ID);
}
void A::func()
{
if (m_Map.IsEmpty())
return;
A* pThis = m_Map[m_ID]; //获取当前对象指针
if( pThis != NULL)
{
pThis->value = pThis->b(); //调用非静态函数成员
}
}