C++静态成员函数访问非静态成员变量的方法

13 篇文章 0 订阅

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。但我们在一个class中要使用CreateThread,并且需要在这个开启的线程中处理类的非静态成员变量的时候,因为CreateThread需要入口函数的地址,因此要进入类的成员函数时要求这个类成员函数是static的。那我们需在类的静态成员函数中访问非静态成员变量该怎么办呢?

一种方法是如下:

int menber;
//将上一行的非静态成员变量改写成下面所示的静态成员变量:
static int menber;

这种方法要求我们把所有要访问的成员变量都改成静态的,这样不仅不方便,而且会要求我们对类的静态成员显示初始化。有没有更好的办法呢?我们可以用给静态成员函数传递类的指针的方法来解决这个问题。方法如下:


前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。

class a
{
public:
  static FunctionA(a* _a)
  {
    _a-> menber = 1;
 cout<<_a-> menber<<endl;
 _a->f();
  }
void f()
{
 cout<<"f被调用了"<<endl;
}
void newThread()
{
   HANDLE hnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FunctionA,this,0,0);
}
private:
  int menber;
};

前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值