注册 登录
编程论坛 C++教室

各位大大,遇到问题了

飞扬冲天 发布于 2012-05-03 20:40, 471 次点击
#include
using namespace std;
class Widget
{
    void f(int){ cout<< "Widget::f()\n";}
    void g(int){ cout<< "Widget::g()\n";}
    void h(int){ cout<< "Widget::h()\n";}
    void i(int){ cout<< "Widget::i()\n";}
    enum { cnt = 4 };
    void (Widget::*fptr[cnt])(int) 地方//求解啊....为什么这个地方会有个 Widget::  呢?
   
public:
   
    Widget()
    {
        fptr[0] = &Widget::f;   // 如过把  Widget:: 去掉这儿就会说不能将void (Windger::*)(int)的值分配到void (*)(int)类型的实体,
        fptr[1] = &Widget::g;
        fptr[2] = &Widget::h;
        fptr[3] = &Widget::i;
    }
   
    void select(int i, int j)
    {
        if(i<=0 || i>cnt)
            return;
        (this->*fptr[i-1])(j);
    }
    int count()
    {
        return cnt;
    }
};


int main()
{
    Widget w;
    int i;
    while(true)
    {
        cout<<"选择(按0退出):";
        cin >>i;
        if(i == 0)
            break;
        w.select(i,47);
    }
    system("pause");
    return 0;
}


还有一个问题:
#include <iostream>
using namespace std;
class Func
{
public:
    Func()
    {
        fpt[0] = f;    为什么我在VC里编译都行,但在VS里这儿就有问题了?   “Func::f”: 函数调用缺少参数列表;请使用“&Func::f”创建指向成员的指针
        fpt[1] = g;                                                          这是什么意思啊?,    加上参数列表不久成了  f()  了?.
        fpt[2] = h;
    }
    enum { cnt = 3};
    void (Func::*fpt[cnt])();
    void selete(int i)
    {
        if(i<=0||i>cnt)
            return;
        (this->*fpt[i-1])();
    }
private:
    void f(){ cout<< "Function f()"<<endl;}
    void g(){ cout<< "Function g()"<<endl;}
    void h(){ cout<< "Function h()"<<endl;}
};

int main()
{
    Func fun;
    int i;
    cin >>i;
    fun.selete(i);
    return 0;
}


这两个程序到底有什么地方不同啊?为什么把下面构造函数里改成 :  
Func()
    {
        fpt[0] = &Func::f();
        fpt[1] = &Func::g();
        fpt[2] = &Func::h();
    }

后却要报错说   :“&”要求左值

??


[ 本帖最后由 飞扬冲天 于 2012-5-3 21:59 编辑 ]
2 回复
#2
rjsp2012-05-04 08:18
前两个是基本语法,google“成员函数指针”
第三个的意思是 --- 顺便说一句,你能不能别用狗屎的中文版 --- 如果你是想调用函数指针,那么缺少了函数参数;如果是想取成员函数地址,那么应该使用&Func::f
第四个问题,和你前面写得一样,应该改 fpt[0] = &Func::f(); 为 fpt[0] = &Func::f;
#3
飞扬冲天2012-05-20 20:44
回复 2楼 rjsp
哦,谢谢...我现在下了英文版的了....
1