Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276543
  • 博文数量: 37
  • 博客积分: 3789
  • 博客等级: 少校
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-02 16:49
文章分类

全部博文(37)

文章存档

2011年(7)

2010年(30)

分类:

2010-12-08 17:18:15

指针,这个是 C/C++ 中最让人迷糊的东西,先上一段代码:

class Foo
{
public:
  int* Value()
  {
    return &Foo::val;
  }

  short* Flag()
  {
    return &Foo::flag;
  }

private:
  static int val;
  short flag;
};

编译,有错误。一看类型不匹配。
return &Foo::flag; // 这里提示类型不匹配
简单的改一下:return &(Foo::flag); 通过编译。可是静态的成员竟然没有问题,原因何在?
  其实这里就是指针的问题,如果定义一个函数指针,指向类的成员函数,这个应该比较常用到:
  typedef int* (Foo::*FUN_PTR) (void);
那么怎么定义一个指针,让他可以指向一个类的数据成员呢?搞明白了这个问题,其实就找到了这个问题的关键:
  typedef short Foo::*FOO_FLAG;
  FOO_FLAG pFlag = &Foo::flag;
到这里,已经可以看出来了,return &Foo::flag;其实返回的是一个指向类数据成员的指针,当然不是 int* 了,所以会类型不匹配。

而静态成员,其实是全局的。不属于类的某一个实体的。所以指向该类的全局对象(静态数据成员)和函数(静态函数)的指针,就是普通指针。

  typedef int* FOO_VALUE;
  FOO_VALUE pVal = &Foo::val;
所以对静态成员,这么做是可以的。
好,上完整的代码:
class Foo
{
public:
    int*   Value()
    {
        typedef int* FOO_VALUE;
        FOO_VALUE pVal = &Foo::val;
        return pVal;
    }

   
    short* Flag() 
    {
        typedef short Foo::*FOO_FLAG;
        FOO_FLAG pFlag = &Foo::flag;
        return &(this->*pFlag);
    }

    static int val;
    short      flag;
};

PS:CU作为号称分享技术的围脖,不能直接插入源代码,很失败。
 
阅读(1780) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~