如:
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 -> *指针
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;
}
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”呢?
是不是只有两个类有同一个父类才可以呢?
我们能不能定义一个指向任何类的相同成员函数的指针呢?
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();
}
{
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)();
}
你说的没错,这样做很不好,不如作成虚函数!
{
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)
{
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 -> *指针
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;
}
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”呢?
是不是只有两个类有同一个父类才可以呢?
我们能不能定义一个指向任何类的相同成员函数的指针呢?
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();
}
{
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)();
}
你说的没错,这样做很不好,不如作成虚函数!
{
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)
{
void Add(int value);
}
typedef void (myClass:: * pFn)(int)
#11
C++之所以可以将数据和操作装在一起,就是因为函数可以取到地址,呵呵,明白了吧?
#12
http://blog.csdn.net/kunp/archive/2005/10/17/505614.aspx