首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

获取错误“必须调用对非静态成员函数的引用”

通常是由于以下几种情况引起的:

  1. 调用非静态成员函数时,使用了类的实例而不是类的引用或指针。在使用非静态成员函数时,需要通过类的实例来调用,而不是直接使用类名。例如,如果有一个类A和一个非静态成员函数func,正确的调用方式是A a; a.func();,而不是A::func();
  2. 调用非静态成员函数时,使用了类的指针但没有使用箭头运算符。如果使用类的指针来调用非静态成员函数,需要使用箭头运算符->来访问成员函数。例如,如果有一个类指针p和一个非静态成员函数func,正确的调用方式是A* p; p->func();,而不是p.func();
  3. 调用非静态成员函数时,将类的实例或指针传递给了一个函数,但该函数没有声明为类的成员函数。如果要在一个函数中调用类的非静态成员函数,该函数必须是类的成员函数或友元函数。否则,编译器无法识别非静态成员函数的调用方式。确保将非静态成员函数调用放在类的成员函数或友元函数中。

综上所述,当出现错误“必须调用对非静态成员函数的引用”时,需要检查调用非静态成员函数的方式是否正确,并确保在合适的上下文中调用该函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

静态成员函数静态成员函数区别?

一个静态成员函数不与任何对象相联系,故不能对静态成员进行默认访问。 它们根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象指针this。...f(Sc &s) 10 { 11 s.nsfn(10); // 转换为Sc::nsfn(&s , 10) 12 s.sfn(10); // 转换为Sc::sfn(10) 13 } 函数...nsfn()调用,编译像注解那样进行转换,s地址作为第一个传递参数。(你并不实际写该调用,由编译来实现。)...在函数内部,Sc::nsfn()静态成员访问将自动把this参数作为指向当前对象指针。而当Sc::sfn()被调用时,没有任何对象地址被传递。因此,当访问静态成员时,无this指针出错。...这就是为什么一个静态成员函数与任何当前对象都无联系原因。

1.8K90

2021-04-14 quickjs调用静态成员函数

有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码函数,而这个函数使用数据又来自于当前交易 首先不考虑用全局变量来保存交易数据,因为js回调c函数时候我们无法在回调函数中区分当前属于哪个交易...,如果你总是把交易id通过回调函数传递过来也是可以实现,只是这样函数就多了个参数,写js代码的人无法理解。...一个简单思路是c代码创建交易类,然后把类函数传递给quickjs,然后在js中调用这个类函数,但是这个实现不了,因为quickjs没有注入静态成员函数接口,其原因文章static成员函数通过类名...::来调用,空指针调用成员方法不出错!...讲解比较清楚 换个思路,我们先用js创建这个类,然后调用eval把类数据传递给它,这样调用这个类静态成员函数时候就可以正确访问到数据了,我们直接修改文件example.cpp 具体实现如下

95720

【Groovy】Groovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数参数传递与键值参数 | 完整代码示例 )

文章目录 一、Groovy 构造函数中为成员赋值 二、Groovy 函数参数传递与键值参数 三、完整代码示例 一、Groovy 构造函数中为成员赋值 ---- Groovy 类没有定义构造函数 ,...但是可以使用如下形式构造函数 , 为 Groovy 类设置初始值 ; new 类名(成员名1: 成员值1, 成员名2: 成员值2) 顺序随意 : 成员顺序随意 , 没有强制要求 , 只需要 成员名..., ${student3.age}" 执行结果为 : student : Tom , 18 student2 : Jerry , 16 student3 : Jim , null 二、Groovy 函数参数传递与键值参数...---- 在 Groovy 构造函数中 , 可以使用 成员名1: 成员值1, 成员名2: 成员值2 类型参数 , 这是键值 map 类型集合 ; 但是对于普通函数 , 不能使用上述格式 ,...// a: "Tom", b: 18 参数代表了一个键值集合 , 执行会报错 // student.printValue(a: "Tom", b: 18) // 传入 a: "Tom", b:

9.1K20

基于 TCP 网络应用在 socket 阻塞模式下 send 调用错误原因深入分析

,经常出现调用send失败情况,send函数在循环中被调用多次之后返回-1,设置errno为EAGAIN,导致程序进入错误处理分支,关闭socket以及记录日志(见图2)。...[ 图 1 程序流程 ] [ 图 2 关键代码 ] 本文试图从send函数以及TCP协议两个点进行问题分析,并复现出错误场景,最后针对导致错误原因来给出解决方案。...socket可以被设置为阻塞和阻塞两种属性;默认被设置为阻塞属性,调用send时,若发送缓冲区中空闲空间长度比请求发送数据更长,则函数直接返回;否则,则会确保所有数据被拷贝到内核之后再返回。...[ 图 5 滑动窗口变化 ] 由上文可见,要不断将通过send调用拷贝进来数据发送出去,必须让滑动窗口向右滑动,并且若想又快又多发送数据,滑动窗口需要尽可能大,并且移动速度更快;而这又受制于接收端返回...被设置为EAGAIN,则调用sleep函数或nanosleep函数休眠一段时间后再进行重试,直到数据发送完毕或者错误次数超过阈值而放弃发送。

2.4K02

this指针介绍和用法

this作用域是在类内部,而且是在类静态成员函数中使用,实际引用并操作对象a成员。 当在类静态成员函数中访问类静态成员时候,编译器会自动将对象本身地址作为一个隐含参数传递给函数。...也就是说,即使你没有写上this指针,编译器在编译时候也是加上this,它作为静态成员函数隐含形参,成员访问均通过this进行。 4.this到底是什么?...一个类所有的实例(对象)调用静态成员函数在内存中只有一份拷贝,尽管在内存中可能有多个对象,而非静态数据成员在类每个对象所在内存中都存在着一份拷贝。...this变量允许相同实例方法为不同对象工作。 每当调用一个实例静态成员函数时,this变量将被设置成引用该实例函数特定类对象。方法代码接着会与this所代表对象特定数据建立关联。...this->i;//错误,this引用任何成员都是错误

50920

C#基础知识系列六(静态类和静态成员

程序不能指定加载静态类的确切时间。 但是,可以保证在程序中首次引用该类前加载该类,并初始化该类字段并调用静态构造函数。...静态成员   静态类可以包含静态方法、字段、属性或事件。 即使没有创建类实例,也可以调用该类中静态成员。 始终通过类名而不是实例名称访问静态成员。...无论一个类创建多少个实例,它静态成员都只有一个副本。 静态方法和属性不能访问其包含类型中静态字段和事件,并且不能访问任何对象实例变量(除非在方法参数中显式传递)。   ...更常见做法是声明具有一些静态成员静态类,而不是将整个类声明为静态类。 静态字段有两个常见用法:一是记录已实例化对象个数,二是存储必须在所有实例之间共享值。   ...静态方法调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法调用生成 callvirt 指令,该指令还检查 null 对象引用

81520

PHP self 关键字

PHP群里有人询问 self 关键字用法,答案是比较明显静态成员函数内不能用 this 调用成员函数,但可以用 self 调用静态成员函数/变量/常量;其他成员函数可以用 self 调用静态成员函数以及静态成员函数...在函数引用上, self 与 static 区别是:对于静态成员函数, self 指向代码当前类, static 指向调用类;对于静态成员函数, self 抑制多态,指向当前类成员函数, static...两者主要区别如下: this 不能用在静态成员函数中, self 可以; 静态成员函数/变量访问, 建议 用 self ,不要用 $this:: 或 $this-> 形式; 静态成员变量访问...,不能用 self ,只能用 this ; this 要在对象已经实例化情况下使用, self 没有此限制; 在静态成员函数内使用, self 抑制多态行为,引用当前类函数;而 this 引用调用重写...详细说则是: 替代类名,引用当前类静态成员变量和静态函数; 抑制多态行为,引用当前类函数而非子类中覆盖实现; 槽点 这几个关键字中,只有 this 要加 $ 符号且必须加,强迫症表示很难受; 静态成员函数中不能通过

62210

C#关键字常见面试题

静态类会进行密封,因此不能继承。它们不能继承自任何类(除了 Object)。静态类不能包含实例构造函数。但是,它们可以包含静态构造函数静态成员静态成员区别?...成员主要指的是:字段、方法、属性、运算符、事件和构造函数等。 静态成员用static修饰符,静态成员不需要。 静态成员属于类所有,静态成员属于类实例化对象所有。...参数在使用 ref 关键字进行引用传递时,必须在方法调用之前其进行初始化。 ref 关键字既可以在进入方法之前初始化参数值,也可以在方法内部参数进行修改。...方法内部没有为 out 参数赋值情况下,方法调用将会导致编译错误。 C#中参数传递 ref与out 区别? ref 指定此参数由引用传递,指定参数在函数调用必须先初始化(有进有出)。...out 指定此参数由引用传递,指定参数在进入函数时会清空参数值,因此该参数必须调用函数内部进行初始化赋值操作(无进有出)。 总结: ref 和 out 都用于引用传递参数。

15810

【笔记】《深入理解C++11》(上)

POD需要满足以下条件: 平凡(Plain)限制: 与memset兼容默认构造和析构函数 与memcpy兼容拷贝, 移动, 赋值, 移动赋值函数 不包含虚函数和虚基类 标准布局(Old)限制: 所有静态成员有相同访问权限...(为了保证成员摆放顺序一致) 派生类有静态成员时, 只有一个仅有静态成员基类(为了保证基类能被直接折叠, 因为C没有继承关系) 基类有静态成员时, 派生类没有静态成员(为了派生类折叠, 因为C...没有继承关系) 类中第一个静态成员类型要与基类不同(为了类指针能直接指向第一个成员) 没有虚函数和虚基类 所有静态成员都满足POD布局(递归定义) 之所以C++11引入POD概念是为了保证我们可以安全地用...最终可以用is_pod::value直接判断是否POD 受限联合 C++11后, 任何引用类型都可以成为union成员(包括函数), 因此称为受限联合 不允许静态成员变量存在 union一些默认函数将被删除...auto禁止结构体中静态成员进行推导 不允许声明auto数组 新增range-for语法要求目标有begin和end函数, 且支持++和==, 常与auto共用, 但要注意range-for中

1.9K20

《逆袭进大厂》第三弹之C++提高篇79问79答

若要使派生类为抽象类,则编译器要求在派生类中,必须纯虚函数予以重载以实现多态性。同时含有纯虚函数类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。...这两者区别在于静态全局变量作用域是整个源程序,当一个源程序由多个原文件组成时,静态全局变量在各个源文件中都是有效。...2、静态静态成员函数之间有一个主要区别,那就是静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。...当在类静态成员函数访问类静态成员时,编译器会自动将对象地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。...1) 类静态成员变量大小,静态成员不占据类空间,成员函数也不占据类空间大小; 2) 内存对齐另外分配空间大小,类内数据也是需要进行内存对齐操作; 3) 虚函数的话,会在类对象插入vptr

2.2K30

C++之类和对象使用(三)

其值不可修改; 只能通过构造函数参数初始化表常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。 常成员函数 如果将成员函数声明为常成员函数,则只能引用本类中数据成员,而不能修改它们。...常成员函数可以引用const数据成员,也可以引用const数据成员。 ? 不用误以为常对象中成员函数都是常成员函数,常对象只保证其数据成员是常数据成员,其值不被修改。...如果在常对象中成员函数未加const声明,系统把它编译为const成员函数。 常成员函数不能调用另一个const成员函数。...下面是错误: Box(int h,int w,int len):height(h){}//错误 4)静态数据成员既可以通过对象名引用,也可以通过类名来引用。...即使没有定义对象,也可以通过类名引用静态数据成员,说明静态数据成员属于类,不属于对象。若是private,则不可在类外直接引用必须通过公用成员函数引用

87090

C++从入门到精通——this指针

因此,this指针引入使得编译器能够准确地识别成员变量与成员函数参数。 this指针可以在静态成员函数中使用,它指向调用函数对象,可以通过this指针访问对象成员变量和成员函数。...C++中通过引入this指针解决该问题,即:C++编译器给每个“静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问...由于 p 是一个空指针,正常来说试图通过空指针调用函数会导致运行时错误,但是本题并没有指针进行解引用调用,而是直接使用cout函数,所以会正常运行。 // 1.下面程序编译运行结果是?...由于 p 是一个空指针,试图通过空指针调用函数会导致运行时错误,本题是p指针解引用调用_a,所以会出现运行崩溃(即this->_a) 什么时候会出现编译报错 编译报错通常在编程过程中出现,以下是一些常见情况...在C++中,每个静态成员函数都隐含地包含一个this指针。

78510

C++之静态成员

C++在类中提供了静态成员。这是非常有必要,因为我们程序设计者是需要这样特性。 静态数据成员 对于静态数据成员,每个类对象都有自己拷贝。而静态数据成员被当作是类成员。...静态数据成员必须在类外初始化一下,否则会导致编译错误。 注:不要试图在头文件中定义(初始化)静态数据成员。在大多数情况下,这样做会引起重复定义这样错误。...静态函数成员 静态函数成员也是属于整个类,无需对象我们也能访问它。这样在大多数情况下可能会出错(比如你在没有创建对象时候,访问了一个静态数据成员),因此C++静态成员函数做了限制。...它只能操作类静态数据成员和类静态函数成员。类普通函数可以访问它们。 这种函数也很有必要,因为他能在我们不创建对象情况下,让我们知道类静态数据成员是什么样子。...char agrc, char **agrv) { MyClass cla1(12); cla1.QWERTY(); cla1.fun(1); //MyClass::fun(12);不行,静态成员函数必须通过对象来引用

47120

java核心技术基础知识整理

(先初始化成员变量,后加载构造函数原因是,构造函数中可能要用到这些成员变量) 父类静态块——子类静态块——父类块——父类构造器——子类块——子类构造器 最终版本:父类静态域——父类静态块——子类静态域...实现方式:方法重载(编译器绑定,前绑定)和方法重写(运行期绑定,后绑定) 18、静态类和静态类 (1)静态静态类中字段与方法都必须是static静态类不需要实例化就可以使用; (2)静态类...2.不能在静态方法中使用this关键字; 3.静态只能访问静态(因为静态代码块在构造方法之前就已经开始初始化,而此时静态还未开始初始化,如果静态能访问静态就会出现发生错误),静态可以访问一切...要想解剖一个类,必须先要获取到该类字节码文件对象。...、父类静态代码块、子类静态变量、子类静态代码块、父类静态变量、父类静态代码块、父类构造函数、子类静态变量、子类静态代码块、子类构造函数 53、Java变量类型 (1)变量类型 静态变量、成员变量

83420

static用法详解

从这个意义上讲,它无法访问属于类对象静态数据成员,也无法访问静态成员函数,它只能调用其余静态成员函数。 下面举个静态成员函数例子。...; 静态成员函数不能访问静态成员函数静态数据成员;    由于没有this指针额外开销,因此静态成员函数与类全局函数相比速度上会有少许增长; 调用静态成员函数,可以用成员访问操作符(.)和(...(7)静态数据成员静态存储,所以必须它进行初始化。   ...通常情况下,类成员必须通过它对象访问,但是可以创建这样一个成员,它能够被 它自己使用,而不必引用特定实例。在成员声明前面加上关键字static(静态)就能创建这样成员。...因为在程序开始执行时必须调用main() ,所以它被声明为static。   声明为static变量称为静态变量或类变量。

1.1K90

【C++】类和对象 (下篇)

: 所以对于使用 const 修饰以及引用类型成员变量,我们必须在初始化列表处其进行初始化: 同样,对于没有默认构造函数自定义类型来说,我们也必须在初始化列表处其进行初始化,否则编译器就会报错...对象引用,所以编译器会先用2022来构造一个Date类型临时对象,然后d4再这个临时对象进行引用,所以只会调用一次构造函数;同时由于临时对象具有常性,所以需要使用const修饰; 注意:单参构造函数并不是指只能有一个参数...针对这个问题,C++设计出了静态成员函数; 3、static 成员函数 静态成员函数是指用 static 关键字修饰成员函数,其特性如下: 静态成员函数没有隐藏this指针,不能访问任何静态成员...;但是相应,没有了 this 指针我们也无法去调用静态成员变量与成员函数,因为静态成员变量需要实例化对象来开辟空间,静态成员函数调用则需要传递对象地址; class A { public:...static int GetN() { return _n; } private: int _i; static int _n; }; int A::_n = 0; 注意:虽然静态成员函数函数不可以调用静态成员

46200

3 :面向对象初级

(静态既可以访问静态,又可以访问静态) 2,静态方法中不可以使用this或者super关键字。 3,主函数静态。 主函数函数特殊之处: 1,格式是固定。 2,被jvm所识别和调用。...简单点说,从源代码看,该功能是否需要访问静态成员变量,如果需要,该功能就是非静态。  如果不需要,就可以将该功能定义成静态。...当然,也可以定义成静态,  但是非静态需要被对象调用,而仅创建对象调用静态  没有访问特有数据方法,该对象创建是没有意义。浪费空间,静态的话是存在静态 代码块 静态代码块。...那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前, 要先看父类是如何自己内容进行初始化。 所以子类在构造对象时,必须访问父类中构造函数。...6,父类初始化完毕后,在对子类属性进行显示初始化。 7,在进行子类构造函数特定初始化。 8,初始化完毕后,将地址值赋值给引用变量. 设计模式:问题行之有效解决方式。其实它是一种思想。

72790
领券