首页 > 编程知识 正文

成员函数可以是静态的,静态成员函数在类外定义

时间:2023-05-06 10:45:45 阅读:166646 作者:3104

3359 blog.csdn.net/Liu _ Zhen _ kai/article/details/81274241? SPM=1001.2101.3001.6661.1 UTM _ medium=distribute.PC _ relevant _ t0.none-task-blog-2~default~bloge

请你也参考一下上面的这个

原文位置: https://www.cn blogs.com/rickyk/p/4238380.html

/*

自己的问题:

今天有问题,静态函数调用费静态函数报告了错误

cannotcallmemberfunctionwithoutobject

因为,要调用成员函数,必须定义对象。

如果希望直接引用,可以静态声明函数

然后查了静态呼叫问题,有点印象,但我忘了。 基础还不牢固。

*/

静态成员函数访问非静态成员的几种方法

众所周知,在c类的成员函数中,缺省情况下提供了this指针。 在非静态成员函数中使用酷酷的耳机调用函数时,编译器会“自动”将此this指针添加到函数类型参数中。 当然,在C的灵活性下,类具有静态成员和静态函数。 也就是说

复制代码

class A

{

公共:

静态语音测试(

{

m_staticA =1;

}

私有:

static int m_staticA;

int m_a

(;

复制代码

在这种情况下,test函数只能访问m_staticA成员,而不能访问m_a。 同学,这是什么问题? 问题都只出现在应用场景中。 我一开始也没在意。 在遇到回调函数这个棘手的问题之前,我真的很难pydkj想到这个知识点。

首先简单说明一下回调,这里的人应该知道回调的意思。 在c中回调主要出现在回调函数中。 当然,c还有仿射函数等其他用法。 忽略这些,在单纯的回调函数这一点上讨论如下。

c类成员函数都暗示了this指针,所以如果我直接注册,例如

typedefvoid(a:3360*funptr ) );

funp Trp=a :3360 hello;

p (;

此时,程序报告错误。 提示信息是缺少this指针。 这意味着,如果你真的想使用p,你需要一个分配了空间的实例来调用。

复制代码

typedefvoid(a:3360*funptr ) );

funp Trp=a :3360 hello;

a;

A *pA=new A (;

(a.) p ) );

(pA-*p ) );

复制代码

当然,如果您只是将c的类静态函数注册为回调函数,则不需要考虑this指针

typedefvoid(a:3360*funptr ) );

FunPtr p=A:test;

p (;

但问题是,你此时的静态函数不能有你的成员变量。 看到了吧。 发生了问题。 面对这些需求,pydkj真的应该好好思考一下如何让静态函数访问非静态成员变量。

方法1 :

有很好的方法。 将实例的地址添加到静态函数的形参表中。 也就是说

复制代码

class A

{

公共:

静态voidtest (a * a ) )。

{

a-m_a =1;

}

void hello () )

{

}

私有:

static int m_staticA;

int m_a

(;

复制代码

这样,回调函数时,可以从无法访问成员非静态变量的静态函数(过于闹别扭)访问非静态成员变量。

方法2 :

其实这个方法在GLIB上被广泛使用。 就是放置全局变量地址

复制代码

A g_a;

class A

{

公共:

静态语音测试(

{

g_a.m_a =1;

}

void hello () )

{

}

私有:

static int m_staticA;

int m_a

(;

复制代码

知道这个方法就好了,但不建议使用全局变量。

方法3 :

众所周知,静态成员函数无权访问非静态成员,但请记住,它有权访问静态成员。 这意味着,如果此类是单个示例,则可以在创建时将this指针指定给静态成员,以便在静态成员函数中放心大胆地使用。

复制代码

class A

{

公共:

A () )。

{

m_gA=this;

}

静态语音测试(

{

m_gA.m_a =1;

}

void hello () )

{

}

私有:

static int m_staticA;

static A *m_gA;

int m_a

(;

复制代码

方法4 :

与方法相似,但他的方向思想对内存块这一概念更多,意味着静态函数的形状参数加上void *的内存起始地址,在内部进行转换

复制代码

class A

{

公共:

静态语音(void * pdata ) )。

{

a*a=(a* ) pData;

a-m_a =1;

}

void hello () )

{

}

私有:

static int m_staticA;

int m_a

(;

a;

test(a );

复制代码

以上整理了四种方法。 当然,方法还有很多。 其实,是这么绕远路。 我们的希望是在不破坏回调函数的漂亮函数接口(加上自己的实例指针)的情况下妥协。 如果你喜欢改变接口,或者用Java这样的接口方式实现,那也没问题。 这里主要提供一个想法。 C确实很灵活,我们想用这把双刃剑。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。