首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 类内函数成员的参数为本类指针有关问题

2012-12-15 
C++ 类内函数成员的参数为本类指针问题例如:class CA{public:CA()~CA()public:fun(CA * pc)//像这样的

C++ 类内函数成员的参数为本类指针问题
例如:
class CA
{
public:
   CA();
   ~CA();
public:
    fun(CA * pc);    //像这样的函数 参数为本类指针的 用的时候有没有特别需要注意的地方??? 
}


[最优解释]

#include <iostream>

using namespace std;

class A
{
public:
void func()
{
cout<<"Happy Ending!"<<endl;
}
};

template <class RETURN,class CLASS>
union ChangeFunc
{
RETURN ( CLASS::*pMemFunc)();
RETURN (*pGlobFunc)(void *);
};

int main()
{
ChangeFunc<void,A> test;
A object;

test.pMemFunc=&A::func;
(*test.pGlobFunc)(&object);

return 0;
}


代码,自己看一下。
[其他解释]
fun(CA * pc);

先要 if (pc != NULL)
或 assert(pc)

或fun(const CA& c)
或fun(CA& c)

[其他解释]
因为类成员函数和非类成员函数调用约定不同,_thiscall与_stdcall的区别.

方法:

1,函数是全局的,声明为类的友元来访问类成员。
2,函数是类的static方法.
[其他解释]
引用:
引用:
忒丑了!

泥也太没欣赏水平了~~~


---------------------

谢谢大家了 我还有个问题  
控制台程序 用SetTimer函数的时候 需要自己接收消息 参数4为函数地址 
格式是回调函数 我怎么才能把回调函数写在类内呢????

例如:
……

回调函数是有一定格式的.如果放在类里面,把他弄成static函数.因为普通类函数前面都有this指针这个隐藏参数.
[其他解释]
直接用Union转化成员函数为普通函数也可以,没尝试,方法给你:
 union {                                // 联合类,用于转换类成员方法指针到普通函数指针(试过编译器不允许在这两种函数之间强制转换),不知道有没有更好的方法。
        void (_USERENTRY *ThreadProc)(void *);
        void (_USERENTRY TMyClass::*MemberProc)();
    } Proc;                                // 尽管联合里的两种函数类型现在看起来有很大不


网址:http://www.cppblog.com/richardhe/articles/56822.html
[其他解释]
引用:
直接用Union转化成员函数为普通函数也可以,没尝试,方法给你:
C/C++ code
 union {                                // 联合类,用于转换类成员方法指针到普通函数指针(试过编译器不允许在这两种函数之间强制转换),不知道有没有更好的方法。
        void (_USERENTRY *ThreadProc)(void *);
     ……

这个可以但是不通用。
可以这样:
template<typename DST,typename SRC>
DST getType(SRC src)
{
     union
     {
        DST dst;


        SRC src;
     }un_type;
     un_type.src = src;
     return un_type.dst;
}
用的时候
class A
{
public:
void F() { printf("Hello"); };
};

typedef void (*pfnF)(void);
pfnF fun = gettype(&A::F);


[其他解释]
个人感觉没什么特别的,只是两个对象的事么..
[其他解释]
没什么特别的.重载赋值操作符也是关于自己类的对象啊.
[其他解释]
    当变通函数使用就好
[其他解释]
可以直接使用,一般类的成员函数都有个this 指针,指向对象本身。

但是作为拷贝构造函数,又不想。。。 


[其他解释]
我觉得没什么不同的  有点像拷贝构造函数 
[其他解释]
没啥大不了的,往里传了一个指针而已
[其他解释]
在线等
~~~
[其他解释]
google 友元
[其他解释]

忒丑了!
[其他解释]
引用:
忒丑了!


头像网址弄不开
[其他解释]
引用:
忒丑了!

泥也太没欣赏水平了~~~


---------------------

谢谢大家了 我还有个问题  
控制台程序 用SetTimer函数的时候 需要自己接收消息 参数4为函数地址 
格式是回调函数 我怎么才能把回调函数写在类内呢????

例如:
SetTimer(NULL,1,1000,MyTimer);

void callback MyTimer(HWND,......)  我想把这个函数写在类内  但是编译不过去 他不让 
{
………………………………
}
为什么?怎么解决?  谢谢大家了 我会加分的。。。。。可以看我结贴率。
[其他解释]
引用:
因为类成员函数和非类成员函数调用约定不同,_thiscall与_stdcall的区别.

方法:

1,函数是全局的,声明为类的友元来访问类成员。
2,函数是类的static方法.

如果类内是static 的话 
SetTimer()这个函数报错了 第4个参数不对 而且我如果要在这个回调函数里用 类内成员变量的话也用不了啊?我新手 求帮忙 谢谢了
[其他解释]
引用:
引用:
引用:
忒丑了!

泥也太没欣赏水平了~~~


---------------------

谢谢大家了 我还有个问题
控制台程序 用SetTimer函数的时候 需要自己接收消息 参数4为函数地址
格式是回调函数 我怎么才能把回……

如果类内是static 的话  
SetTimer()这个函数报错了 第4个参数不对 而且我如果要在这个回调函数里用 类内成员变量的话也用不了啊?我新手 求帮忙 谢谢了
[其他解释]
该回复于2011-01-24 17:31:29被版主删除
[其他解释]
楼上两位高手,我菜鸟啊 看不懂模版 容器什么的啊。。。。
[其他解释]
fun(CA * pc);
pc指针可以使用私有变量,默认是友元

热点排行