关于类的前向声明

myregexp\widget.cpp:15: error: variable ‘QRegularExpression re‘ has initializer but incomplete type? 报错信息 variable ‘QRegularExpression re’ has initializer but incomplete type 表明编译器在处理 QRegularExpression 类型的变量 re 时,无法识别该类型的完整定义,这通常是因为缺少必要的头文件包含。QRegularExpression 是 Qt 中用于处理正则表达式的类,若要使用它,必须包含 头文件。在使用 QRegularExpression 的源文件中添加 头文件的包含语句。 阅读详情

前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。

比如class foo;

声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些操作)都不知道。

因此这个类的作用也很有限.

(1)不能定义foo类的对象。

(2)可以用于定义指向这个类型的指针或引用。(很有价值的东西)

(3)用于声明(不是定义)使用该类型作为形参或者返回类型的函数。

正因为有前向声明的存在,我们在很多时候可以简便的做一些事情。

在c++中,如果要为类编写头文件的话,一般是要#include一堆头文件的,但利用前向声明和c++编译器的特性,其中大部分是不需要的。

c++编译器做的事情主要是:1.扫描符号;2.确定对象大小。

所以很多时候并不需要将类都include进来。

比如:

(1)由于所有对象类型的引用所占用的空间都是相同大的,所以c++编译器很好确认对象大小。

class string;

class Sample

{

private:

string &s;

};

这里只需要做一个string的前向声明就可以了,不需要#include <string>

(2)由于所有类型的指针也是相同大小的。所以与(1)类似,也可以只做前向声明就好。

(3)声明成员函数的形参或者是返回类型,也可以利用前向声明的性质。

class string;

class foo;

class Sample

{

public:

foo foo_test(foo &);

private:

string &s;

foo *f;

};

这里,我根本没有定义一个foo类,但是还是可以这样用,因为成员函数不占类对象的大小,所以c++编译器还是可以确定对象的大小。

前向声明的作用在于告诉编译器这个一个在别的地方定义的类型。这样C++编译器就能生成正确的符号表了。

C++中类的前向声明 在C++中可以只对类进行声明,而不对其进行定义,例如 class MyClass; 该声明会向程序引入名字MyClass并且指明MyClass是一种类类型。这种对类的声明叫做前向声明。 1 使用前向声明 1.1 声明指针或引用 在声明了类之后,可以定义指向这种类的指针或引用。 MyClass* pmc; MyClass& rmc = *pmc; 此时,只是说明pmc是一个指针,该指针指向了MyClass,可以不必关心MyClass具体的结构,引用变量rmc的情况也是一样的。 1. 阅读详情

相关推荐

离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制

在进行深度学习算法的环境部署时,由于生产服务器被彻底隔离外网,只能把conda中env文件夹中的虚拟环境文件夹从开发机直接拷到Windows 服务器,但在运行labelimg等工具时可能报错,因此用conda-pack来解决。

weixin_44115575的博客 1427

variable `xxx‘ has initializer but incomplete type 错误分析及解决办法

编译时报错: variable `xxx’ has initializer but incomplete type在编译某一个文件时,对变量进行了初始化,但是在初始化之前,没有定义定义过这个变量。 在c++当中,声明了结构体或者类,在初始化变量时,会出现这样的问题。 举个浅显的例子: 在这个例子当中,当你编译的时候,先编译main(),但是却在main()函数之后对 myStruct这个结构体进行了定义,编译将会报错。修复错误的方法是,在初始化之前,对结构体变量的类型进行完全定义。或者是将这个定义放在mai

学习本身就是一件很痛苦的事 1万+

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 353

类的前向声明,class和include的区别

前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。 比如class foo; 声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,

wuyu1125的专栏 2011

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5078

利用ANSYS随机振动分析功能实现随机疲劳分析

本文介绍了ANSYS随机振动分析功能,以及利用该功能,按照Steinberg提出的基于高斯分布和Miner线性累计损伤定律的三区间法进行ANSYS随机疲劳计算的具体过程。在工程应用中,汽车、飞行器、船舶以及其它各种机械或零部件,大多是在随机载荷作用下工作,当它们承受的应力水平较高,工作达到一定时间后,经常会突然发生随机疲劳破坏,往往造成灾难性的后果。因此,预测结构或零部件的随机疲劳寿命是非常有必要的。在工程界,疲劳计算广泛采用名义应力法,即以S-N曲线为依据进行寿命估算的方法,可以直接得到总寿命。

qq_38220914的博客 7611

三、问题分析(一)variable ‘XXX’ has initializer but incomplete type

以上述这个结构体为例,正确的应该是file_operations,但是我们写成了file_operation,这样就会导致这个编译错误。(2)另外一种情况是,你初始化某个头文件中定义的结构,此时如果你的初始化的时候将头文件中定义的结构拼写错误也会导致这个报错。(1)当你自己定义一个结构时,使用的时候没有申明就对他进行了初始化,编译器找不到定义他的具体类型,会报错。

weixin_42744482的博客 740

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 972

类的前向声明

类可以前向声明,但是定义不能定义对象,只能dingli

Edward_hua123的专栏 653

opencode : 无法将“opencode“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

opencode命令识别问题与openclawcodexgemini确保的路径在 PATH 中。这个知识对所有 npm 全局工具通用。

一键难忘的博客 4521

24届数字IC验证——SV+UVM基础知识汇总(一)

汇总整理在面试过程中常见的问题,如果都能回答下来,那么面试肯定不成问题的分别构建不同抽象级的transaction,来实现复杂的激励。(以前是单一层次的sequence,对激励复用、上层复用不塌友好)不同层级之间的sequence没有继承关系,相互之间进行转换低层次的sequence从高层次的sequencer中获取高层次的sequence,并将其转换为低层次的sequence,再通过低层次的sequencer发送出去如何连接:低层次的sequencer包含高层次sequencer的句柄。

qq_42135020的博客 3151

C++类的前向声明

前向声明和#include类似,但是#include会增加编译时间,而且#include文件中可能有很多用不到的功能模块。 1、对于未定义的类,使用前要先前向声明,前向声明后只能使用对象指针以及对象引用,不能直接使用对象,更不能访问对象细节 #include<stdio.h> //class B;//注释掉前置声明会报错 class A{ public : void func_A(B &b); void printA(){ printf("pri

努力的八戒 1264

4、双足机器人mpc基础概念

机器人控制实际上不是连续的,是离散的,这就是控制信号的采样周期dt,一般每1ms对机器人发起一次控制信号。一般来说,dt越小,控制器的响应速度越快,但是由于预测的精度有限,如果控制时域过长,预测的误差会逐渐累积,导致控制器的性能下降。注意:1)在程序处理时,u的维度并不是由机器人的自由度确定的,是由其变量的个数及每个变量的空间维度确定,对于双足,采用力矩和力来控制,则u的维度是“2*2*3=12”。机器人实际运动过程中表现出来的状态x,x和xd是一致的,也包括运动速度ν、角速度ω、角度θ、位置p等。

1213

C++类的前向声明的学习

2013-04-06 17:12:18 标签:初学者 类 C++类前向声明 类相互包含 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://liam2199.blog.51cto.com/2879872/1172175       假设声明两个类A和B,如果需要在A.h中定义B类对象,B b_; 势必要包

Edward_hua123的专栏 1065

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++类的前向声明(forward declaration)

一、使用场景假设有两个类A和B,类A要将类B的对象作为自己的成员使用,并且类B将类A的对象作为自己可以访问的数据,那么这个时候要在a.h中include b.h,同时在b.h 中要include a.h,但是相互包含是不可以的,这个时候就要用到类的前向声明了。二、使用方法假设B类中已经包含了a.h,那么在A类中不能再包含b.h,要在A类中前向声明类B,如下# include "B.h" clas...

LEOX 4万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 类的前向声明的用法

C++ 类的前向声明的用法。

jjjqqq123321的博客 1348

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++ 类前向声明

在一个群内看到的消息,关于类的前向声明: 前向引用声明,在提供一个完整的类声明之前,不能声明该类的对象;可以做函数参数 或者声明对象指针;class A并不是真正意义声明A类,只是告诉编译器,从现在开始碰到的符号A是一个类,以保证符号识别。因此使用A a;编译器不知道类A有没有构造函数,也不知道该为对象a分配多大空间;下面部分转自    http://blog.sina.com.cn/s

tracyliang223的专栏 1265

类的前向声明问题

类的前向声明 使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。 #include<bits/stdc++.h> using namespace std; class A; //此处的声明只能说明 A 是一个类名 //而不能给出该类的完整定义,因此不能访问A的内部成员 class B { int m_B=0; A *Point_A; /

Dhx_Go的博客 880
上一篇: 字面值常量的知识点
下一篇: python搜索引擎之搜索系统的建立——根据关键字命中次数排分给出前若干个答案
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值