首页
学习
活动
专区
工具
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.9K90

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

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

1K20
  • 【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.3K20

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

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

    2.7K02

    this指针的介绍和用法

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

    54120

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

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

    83420

    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 要加 $ 符号且必须加,强迫症表示很难受; 静态成员函数中不能通过

    63510

    【C++指南】类和对象(十):const成员函数

    引言 在C++中,const成员函数是面向对象编程中保障数据安全性的重要机制。它通过限制函数对类成员的修改权限,提升代码的健壮性和可维护性。...基本语法 在成员函数的参数列表后添加const关键字,表明该函数不会修改类的非静态数据成员。...保障数据安全 禁止修改成员变量:若在const函数中尝试修改非mutable成员,编译器直接报错 允许访问静态成员:静态成员不属于对象,可被修改 class A { static int...与const对象的关系 const对象只能调用const成员函数:违反此规则会导致编译错误 非const对象优先调用非const版本:若无匹配的非const函数,则调用const版本(权限可以缩小...易错点分析 返回非const引用:若const函数返回成员的非const引用,可能通过返回值意外修改数据 // 错误示例:通过返回值修改name string& Student::getName(

    6300

    【笔记】《深入理解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中的

    2K20

    《逆袭进大厂》第三弹之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,则不可在类外直接引用,必须通过公用的成员函数引用。

    88790

    C#关键字常见面试题

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

    17310

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

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

    1.6K10

    C++之静态成员

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

    47920

    Java——类与对象

    •通过带参数的构造方法,显式地为实例变量赋予初始值 •可以给一个类添加多个版本的构造函数,每个版本的构造函数必须要参数的个数不同或参数的类型不同 •构造方法除了给属性赋值还可根据需要写其它代码,一个构造方法内也可以调用另一个构造方法...5.this关键字 this理解为当前对象的另一个名字,代表对当前对象的一个引用。...普通方法‌:必须通过对象引用调用。例如:object.methodName()(2)内存分配 ‌ 静态方法‌:在类加载时分配内存,属于类级别。...(3)访问权限‌ 静态方法‌:只能访问静态成员变量和其他静态方法,不能访问非静态成员变量和非静态方法。 ‌ 普通方法‌:可以访问所有成员变量和方法,包括静态和非静态的。...(4)重写和隐藏行为‌ 静态方法‌:由于静态方法属于类级别,不能被重写(override)。尝试在子类中重写父类的静态方法会导致编译错误。‌

    7700

    【C++篇】C++类与对象深度解析(四):初始化列表、类型转换和static成员讲解

    1.3.1 引用类型成员初始化 引用类型成员变量在 C++ 中必须在声明时被初始化,不能在构造函数体内赋值,必须使用初始化列表。...静态成员函数没有this指针,因此它只能访问类的静态成员变量或静态成员函数,不能访问非静态成员。...3.2.1 静态成员函数的特性 没有this指针:静态成员函数没有 this 指针,因此不能访问非静态成员。...只能访问静态成员:静态成员函数只能访问静态成员变量或静态成员函数,不能访问类的非静态成员。 通过类名调用:静态成员函数可以通过类名直接调用,而不需要依赖于对象实例。 示例:静态成员函数的使用。...静态成员函数没有 this 指针,因此它不能访问非静态成员变量或函数。 通过类名直接访问静态成员函数是它的主要特性之一。

    6800

    java核心技术基础知识整理

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

    85920

    C++的魔法世界:类和对象的终章

    必须使用初始化列表的类: ​ 没有默认构造的类类型成员变量、被const修饰的成员变量(声明时必须初始化)、被引用的成员变量(声明引用时必须初始化) 自定义类型成员变量,没有默认构造想要调用它的构造需要传参...注意:编译器生成的临时对象具有常性 如下图:前面提过,隐式类型转换实际上通过调用构造函数生成临时对象,而临时对象又去调用拷贝构造完成赋值的过程,这里的临时对象具有常性,下图的**普通d1对象尝试对一个具有常性的对象进行引用...将d1对象使用const修饰后就不会出现这种问题 但这又引出了新的问题,临时对象在调用完拷贝构造函数,出了作用域它就会被销毁了,而常性d1对象对临时对象使用了引用,这导致d1对象对一块被销毁引用,是野引用...指针 非静态的成员函数,可以访问任意位置的成员变量和成员函数 静态成员函数,只能访问静态成员变量和静态成员函数,它没有this指针 class pp { public: pp(int z =...error C2597: 对非静态成员“pp::_z”的非法引用 Fun函数就不会有什么问题,它并不是静态成员函数,函数内部使用this指针,和静态成员变量都是正确的。

    5000
    领券