VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 495|回复: 7

[求助] 求大神指教一下

[复制链接]
07_avatar_middle
在线会员 发表于 2016-4-16 17:00:11 | 显示全部楼层 |阅读模式
C++中静态成员函数怎么访问非静态数据成员?求大神指教一下




上一篇:把文本放入资源里 Debug下读取正常 Release模式下出错 并包含乱码
下一篇:多客户端如何并行传大文件
53_avatar_middle
在线会员 发表于 2016-4-23 19:26:12 | 显示全部楼层
举个例子你就比较清楚了。
这是一个简单的多线程类。

class  CMyThread
{
    public :
                CMyThread();
                ~CMyThread();
    private:
             //静态成员函数
             static unsigned int WINAPI  ThreadFunction(LPVOID lParam);

    protected:
             //线程工作函数
             virtual unsigned int ThreadBody();

    public:
           //启动线程
            void  BeginThread();

    private:
             //非静态成员变量
             int   m_test;
             HANDLE  m_hThread;
}

//静态成员函数
//传递的参数为类 CMyThread 的对象指针
unsigned int  WINAPI CMyThread::ThreadFunction(LPVOID lParam)
{
         //将参数强制转换为类对象指针
        CMyThread* lpThread = (CMyThread*)lParam;
        
        //访问类的非静态成员变量
        TRACE("%d",lpThread->m_test);

        //访问类的非静态成员函数
        return lpThread->ThreadBody();
}

unsigned int CMyThread::ThreadBody()
{       
        ......
        return 0;
}

BOOL CMyThread::BeginThread()
{
        unsigned int dwThreadID = 0;
        
        //注意这个函数调用
        //参数 ThreadFunction 是将 类的静态成员函数 作为参数传递
        //参数 this 是将 类的对象指针 作为参数传递 (供ThreadFunction使用)
        m_hThread = (HANDLE)_beginthreadex(NULL,0,ThreadFunction,this,0,&dwThreadID);

}

int  main(void)
{
      CMyThread  a;
      a.BeginThread();
}



27_avatar_middle
online_vip 发表于 2016-4-20 13:38:13 | 显示全部楼层
对 一个类对象传进去
51_avatar_middle
online_admins 发表于 2016-4-16 22:58:39 | 显示全部楼层
没什么特别好的办法,只能是得到当前实例对象的指针才行,之后才可以访问
07_avatar_middle
ico_lz  楼主| 发表于 2016-4-22 22:20:55 | 显示全部楼层
Syc 发表于 2016-4-16 22:58
没什么特别好的办法,只能是得到当前实例对象的指针才行,之后才可以访问

是用指针去访问 静态成员函数吗?但是这跟非静态数据成员有什么关系呢
07_avatar_middle
ico_lz  楼主| 发表于 2016-4-22 22:21:14 | 显示全部楼层
Syc 发表于 2016-4-16 22:58
没什么特别好的办法,只能是得到当前实例对象的指针才行,之后才可以访问

是用指针去访问 静态成员函数吗?但是这跟非静态数据成员有什么关系呢?
07_avatar_middle
ico_lz  楼主| 发表于 2016-4-22 22:22:41 | 显示全部楼层
Syc 发表于 2016-4-16 22:58
没什么特别好的办法,只能是得到当前实例对象的指针才行,之后才可以访问

意思是i 通过这个类的静态成员函数 再通过另一个类的指针去访问另一个类的非静态数据成员吗
53_avatar_middle
在线会员 发表于 2016-4-23 20:13:31 | 显示全部楼层
类的静态成员变量在内存中都有且只有唯一的一份拷贝
程序初始化时,静态变量将会被自动分配存储空间(静态对象还将会调用构造函数)

class MyClass
{
  public:
      static  void  test_1();
      void  test_2();
  public:
      static   int  a;
      int b;
}

因此,可以不用对象就可以访问静态成员变量如: MyClass::a = 1; 因为内存中已存在 a
但是 MyClass::b 却不能访问,为什么?因为b不是静态变量,内存中并不存在 b,b是依赖于某个对象而存在的
比如说 MyClass  c; 当你定义了一个 c 对象时,内存中就存在了一个 c 对象,就可以通过 c.b来访问b了,b是依赖于c而存在的。

二、静态成员变量是不依赖与对象的,同理,静态成员函数的调用也不依赖于对象。
比如 MyClass::Test_1(); 是合法的。  但是 MyClass::Test_2();却不行,因为 Test_2()必须通过对象来调用,如c.Test_2()。

三、在静态成员函数访问非静态成员变量必须依赖于对象。

如 void MyClass::Test_1()
   {
          MyClass  d;
          d.b = 100;         //这样写才是合法的
   }

或者  void MyClass::Test_1(MyClass * p)
        {
             p.b = 100;
        } //上面的多线程类就是这种写法。

        CMyClass e;
        CMyClass::Test_1(&e);
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-25 04:16

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表