如何定义一个指向类成员函数的指针?

时间:2022-08-30 09:48:29
如何定义一个指向类成员函数的指针?

如:
class myClass
{
void Add(int value);
}

普通的函数可以这么定义:

typedef void (*add)(int value);

但因为类的成员函数参数表中包含一个隐藏的this指针,
所以不能如上定义,
求教高手,请问该如何定义呢?

12 个解决方案

#1


class simple{
public:
      int a;
      int fn(int x);
};

定义一个指向成员a的指针

int simple::* pa  = &simple::a;
//因为引用的不是一个具体的对象.所以pa并没有一个确切的地址.而是一个对象内相对的一个地址.


定义一个指向成员函数的指针

int (simple:: *pfn) (int)  = simple::fn;



使用这些指针时.
对象.*指针        或
p -> *指针

#2


#include<iostream>
using namespace std;

class myClass
{
public:
    
    void Add(int value)
{
    //
}
     
};


typedef void (myClass:: *Add)(int value);


int main()
{
    system("pause");
    return 0;
}

#3


<<c++ 编程思想>>10.4节

#4


楼上的兄弟们讲的很好,可是定义指针时和具体的类型扯上了关系,
我们能不能定义一个指向任何类的相同成员函数的指针呢?

class class1
{
void Add(int value);
}

class class2
{
void Add(int value);
}

有没有可能定义一个函数指针类型,可以指向不同类中的两个相同的方法“Add”呢?
是不是只有两个类有同一个父类才可以呢?

#5


可以的话在成员函数前面都加上staic,那就可以作为普通函数指针来处理

#6


class TEST013_API CTestSTL
{
string m_str;
public:
CTestSTL();
virtual void prn();

};
CTestSTL::CTestSTL()
{
m_str = ("CTestSTL from DLL");

}
void CTestSTL::prn()
{
cout << m_str << endl;
}

void main()
{
typedef void (CTestSTL::*Fun)(void);
cout << "Test" << endl; 
CTestSTL *p = new CTestSTL;

Fun funPtr;
funPtr = CTestSTL::prn;
(p->*funPtr)();
//funPtr = &obj.prn;
//*funPtr();
}

#7


mark

#8


int (simple:: *pfn) (int)  = simple::fn;

#9


class C
{
public :
C(){};
int Add()
{
   
  cout<<"Add C"<<endl;
  return 1;
}
};

class A :public C
{
public:
 
    A(){};
int Add()
{
   
  cout<<"Add A"<<endl;
  return 1;
}
};
class  B :public C
{
public:
B(){};
int Add()
{
   
  cout<<"Add B"<<endl;
  return 1;
}

};
typedef int (C:: *Fun)();
Fun f;
void main()
{
   

   
C *c=new C;
f=C::Add;
(c->*f)();
    f=static_cast<int (C:: *)(void)>(B::Add);
C *c1=new B;
(c1->*f)();

f=static_cast<int (C:: *)(void)>(A::Add);
C *c2=new A;
(c2->*f)();



}
你说的没错,这样做很不好,不如作成虚函数!

#10


class myClass
{
void Add(int value);
}
typedef void (myClass:: * pFn)(int)

#11


C++之所以可以将数据和操作装在一起,就是因为函数可以取到地址,呵呵,明白了吧?

#12


http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx

#1


class simple{
public:
      int a;
      int fn(int x);
};

定义一个指向成员a的指针

int simple::* pa  = &simple::a;
//因为引用的不是一个具体的对象.所以pa并没有一个确切的地址.而是一个对象内相对的一个地址.


定义一个指向成员函数的指针

int (simple:: *pfn) (int)  = simple::fn;



使用这些指针时.
对象.*指针        或
p -> *指针

#2


#include<iostream>
using namespace std;

class myClass
{
public:
    
    void Add(int value)
{
    //
}
     
};


typedef void (myClass:: *Add)(int value);


int main()
{
    system("pause");
    return 0;
}

#3


<<c++ 编程思想>>10.4节

#4


楼上的兄弟们讲的很好,可是定义指针时和具体的类型扯上了关系,
我们能不能定义一个指向任何类的相同成员函数的指针呢?

class class1
{
void Add(int value);
}

class class2
{
void Add(int value);
}

有没有可能定义一个函数指针类型,可以指向不同类中的两个相同的方法“Add”呢?
是不是只有两个类有同一个父类才可以呢?

#5


可以的话在成员函数前面都加上staic,那就可以作为普通函数指针来处理

#6


class TEST013_API CTestSTL
{
string m_str;
public:
CTestSTL();
virtual void prn();

};
CTestSTL::CTestSTL()
{
m_str = ("CTestSTL from DLL");

}
void CTestSTL::prn()
{
cout << m_str << endl;
}

void main()
{
typedef void (CTestSTL::*Fun)(void);
cout << "Test" << endl; 
CTestSTL *p = new CTestSTL;

Fun funPtr;
funPtr = CTestSTL::prn;
(p->*funPtr)();
//funPtr = &obj.prn;
//*funPtr();
}

#7


mark

#8


int (simple:: *pfn) (int)  = simple::fn;

#9


class C
{
public :
C(){};
int Add()
{
   
  cout<<"Add C"<<endl;
  return 1;
}
};

class A :public C
{
public:
 
    A(){};
int Add()
{
   
  cout<<"Add A"<<endl;
  return 1;
}
};
class  B :public C
{
public:
B(){};
int Add()
{
   
  cout<<"Add B"<<endl;
  return 1;
}

};
typedef int (C:: *Fun)();
Fun f;
void main()
{
   

   
C *c=new C;
f=C::Add;
(c->*f)();
    f=static_cast<int (C:: *)(void)>(B::Add);
C *c1=new B;
(c1->*f)();

f=static_cast<int (C:: *)(void)>(A::Add);
C *c2=new A;
(c2->*f)();



}
你说的没错,这样做很不好,不如作成虚函数!

#10


class myClass
{
void Add(int value);
}
typedef void (myClass:: * pFn)(int)

#11


C++之所以可以将数据和操作装在一起,就是因为函数可以取到地址,呵呵,明白了吧?

#12


http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx