返回信息流做作业的时候遇到的一个问题,我想弄个成员函数的数组,在网上找到个解决方案:
class CTest
{
public:
void method_0() {}
void method_1() {}
void method_2() {}
private:
void use();
};
void (CTest::*methods[])() = {
&CTest::method_0,
&CTest::method_1,
&CTest::method_2
};
void CTest::use()
{
(this->*methods[0])();
(this->*methods[1])();
(this->*methods[2])();
}
int main()
{
CTest test;
(test.*methods[0])();
(test.*methods[1])();
(test.*methods[2])();
}
现在有两个问题
首先methods的类型到底是什么?是成员函数数组,还是成员函数指针的数组?
然后到底要怎样才能让methods变成private的?method_0、method_1、method_2也为private的...
纠结
这是一条镜像帖。来源:北邮人论坛 / cpp / #45423同步于 2010/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【被成员函数指针数组搞纠结了】
SinceBelieve
2010/10/28镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
methods肯定是个指针数组,method先于[]结合再与CTest::*结合,是个成员指针的数组。
怎么让methods成为private?,methods本来就是个全局域里的数组,怎么可能成为private?或者你想把它作为CTest的数组成员,那样的话才行,那样的话method_0,1,2都成为private也可以。单纯method_0,1,2改为private的话会报错,不然谁都可以通过那个全局的数组访问private成员函数了。就是要么数组放外面,那三个函数必须为public,要么数组是CTest成员,不太懂你要的效果。
【 在 SinceBelieve 的大作中提到: 】
: 做作业的时候遇到的一个问题,我想弄个成员函数的数组,在网上找到个解决方案:
: class CTest
: {
: ...................
总之就是让method_0,1,2变成私有的,让methods也变成私有的,这样只允许成员函数使用method_0,1,2和methods
我试着把methods放到类里面,method_0,1,2和methods都改为私有,在CTest的构造函数中对methods初始化,编译报错,以下错误报告可能有帮助
ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&CTest::method_0'
代码是
class CTest
{
private:
void method_0() {}
void method_1() {}
void method_2() {}
private:
void (*methods[])();
public:
CTest()
{
methods[0] = &method_0;
methods[1] = &method_1;
methods[2] = &method_2;
}
};
之前用静态成员解决了私有问题但是静态函数无法访问非静态成员变量害我白高兴了一阵
这句报错意思是:不合格的或者被括号包括住的非静态函数禁止取地址转换成成员函数的指针。method_0,1,2处于CTest{}内,&method_0不允许,即使是在类定义内也需要强制显示指定函数所属类,具体原因我也不清楚,所以那三条语句改为&CTest::method_0,&CTest::method_1,&CTest::method_2
另外methods的定义,不能使用普通函数指针修饰,指针前也要加CTest::,不然这是一个普通函数指针的数组,不是成员函数的指针数组。
【 在 SinceBelieve 的大作中提到: 】
: 总之就是让method_0,1,2变成私有的,让methods也变成私有的,这样只允许成员函数使用method_0,1,2和methods
: 我试着把methods放到类里面,method_0,1,2和methods都改为私有,在CTest的构造函数中对methods初始化,编译报错,以下错误报告可能有帮助
: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&CTest::method_0'
: ...................
真的,居然成了...
class CTest
{
private:
void method_0() {}
void method_1() {}
void method_2() {}
private:
void (CTest::*methods[])();
public:
CTest()
{
methods[0] = &CTest::method_0;
methods[1] = &CTest::method_1;
methods[2] = &CTest::method_2;
}
};
总结一下,暂时不想了,move on
/*
* 演示用数组管理成员函数
*
* 需要考虑的问题
* 1. 函数数组是私有的还是公有的
* 2. 数组中成员函数是私有的还是公有的
*
* methods_private: 私有数组, 成员函数可以是私有的或公有的
* methods_public: 公有数组, 成员函数可以是私有的或公有的
* methods_global: 全局数组, 只能访问公有成员函数
*
* 各自的特点
* (1) methods_public和methods_private对于成员函数是公有还是私有没有要求
* 不同在于非成员函数能否使用
* (2) methods_global中只能存放公有成员函数
* 只要methods_global可见,就能使用
* methods_global不便放在头文件中,不便于管理
* methods_public和methods_private的所属关系明确
* 但是需要在构造函数中初始化
*
*/
#include <iostream>
using namespace std;
class CTest
{
public:
void public_method0() { cout << "public_method_0" << endl; }
void public_method1() { cout << "public_method_1" << endl; }
void public_method2() { cout << "public_method_2" << endl; }
private:
void private_method0() { cout << "private_method_0" << endl; }
void private_method1() { cout << "private_method_1" << endl; }
void private_method2() { cout << "private_method_2" << endl; }
private:
void (CTest::*methods_private[6])();
public:
void (CTest::*methods_public[6])();
public:
CTest()
{
methods_private[0] = &CTest::public_method0;
methods_private[1] = &CTest::public_method1;
methods_private[2] = &CTest::public_method2;
methods_private[3] = &CTest::private_method0;
methods_private[4] = &CTest::private_method1;
methods_private[5] = &CTest::private_method2;
methods_public[0] = &CTest::public_method0;
methods_public[1] = &CTest::public_method1;
methods_public[2] = &CTest::public_method2;
methods_public[3] = &CTest::private_method0;
methods_public[4] = &CTest::private_method1;
methods_public[5] = &CTest::private_method2;
}
public:
void useMethods()
{
for (int i=0; i<6; ++i)
(this->*methods_private[i])();
}
};
void (CTest::*methods_global[])() = {
&CTest::public_method0,
&CTest::public_method1,
&CTest::public_method2,
//&CTest::private_method1, //不能是私有的
//&CTest::private_method2, //不能是私有的
//&CTest::private_method3 //不能是私有的
};
int main()
{
CTest test;
test.useMethods();
for (int i=0; i<6; i++)
(test.*test.methods_public[i])();
for (int i=0; i<3; i++)
(test.*methods_global[i])();
system("pause");
}