C/C++常见错误
1.段错误
段错误:指的是访问了不可访问的内容,内存要么是不存在的,要么是受到系统保护的。
如:1.释放了不存在的内存(堆内存)
int a = ;
free a;
2.代码被重复定义了
往往是由于头文件被重复定义了。可以使用宏定义来解决。xxx可以是任意变量名
#ifndef xxx
#define xxx
添加你所定义文代码
#endif
3.forward declaration(前置声明)
当想要使用一个类型的时候除了包含头文件外还可使用含前置声明。并且只能把该类型声明为指针或者引用,不能进行初始化也就是说在没有定义之前都无法使用。这个时候编译器只知道了类型,根本不知道它的大小等信息。这也是为什么不能声明为普通变量的形式,因为编译器无法对其进行初始化(incomplete type)。使用前置声明时,往往多用于函数参数中。
test1.h
class A{
public:
void say();
};
test2.h
class A;
class B{
public:
A* a_;
void say(A* a);
}
可以看到类B使用了类A,除了引入头文件外还以使用前置声明即在class B{}上面添加“class A;"便可。在之后的test2.cpp中必要包含test1.h才能对class A进行定义,然后进行使用,如
#include "test2.h"
#include "test1.h"
void B::say(A* a){
a->say();
}
使用前置声明的方式加强了类的可读性,能够适当减少繁琐的#include,以及改善头文件相互包含引起的问题。这类问题要记住:在声明时可以只需要知道类型,使用时必须进行了定义。
4.头文件之间的相互包含问题
在定义头文件的时候一定要记住使用条件预编译语句,防止重复包含
#ifndef TEST
#define TEST
//your content
#endif
test1.h
#ifndef TEST1
#define TEST1
#include "test2.h"
class A{
public:
B* b;
};
#endif
test2.h
#ifndef TEST2
#define TEST2
#include "test1.h"
class B{
public:
A* a_;
void say(A* a);
}
#endif
此时展开test1.h会得到
#ifndef TEST1
#define TEST1
class B{
public:
A* a_;
void say(A* a){
a_ = a;
}
}
class A{
public:
B b;
};
#endif
可以看到class B的定义是在class A之前定义的,B中又对A进行了声明,这个时候只需要在test2.h中使用前置声明(class A)便可以编译过test1.h。编译test2.h同理,test1.h中使用前置声明(class B)。
C/C++常见错误的更多相关文章
- 初识JAVA(二)(送给Java和安卓初学者)----常见错误
博主接着上篇的来讲哦,以后的更新中,博主会出一些练习题,有兴趣的可以做做然后吧代码粘贴到下面,大家可以一起研究学习,一起进步,本篇文章主要讲的是: 一.常见错误 二.连接上篇一起的训练 无论是什么方向 ...
- ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock
ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错:E: Could not ...
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
- C语言初学者代码中的常见错误与瑕疵(23)
见:C语言初学者代码中的常见错误与瑕疵(23)
- struts2.5框架使用通配符指定方法常见错误
struts2.5框架使用通配符指定方法(常见错误) 在学习struts框架时经常会使用到通配符调用方法,如下: <package name="shop" namespace ...
- .Net常见错误
常见错误 #1: 把引用当做值来用,或者反过来 C++ 和其他很多语言的程序员,习惯了给变量赋值的时候,要么赋单纯的值,要么是现有对象的引用.然而,在C# 中,是值还是引用,是由写这个对象的程序员决定 ...
- WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭
在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...
- Python程序的常见错误(收集篇)
关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...
- 【ubuntu 】常见错误--Could not get lock /var/lib/dpkg/lock
ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错: E: Could not ...
随机推荐
- 不会点git真不行啊.
基本使用: // 进入项目根目录, git init // 接管你的项目文件夹, git status // 查看状态. 绿色已接管,红色未管理 git add . // 添加管理当前目录所有文件及子 ...
- bottle 0.5中的key-value数据库
import anydbm as dbm import cPickle as pickle class BottleBucket(object): '''Memory-caching wrapper ...
- Python成长之路【第二篇】Python基础之数据类型
阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型 ...
- python日常小计
1.查看变量类型: pring type(item) 2.解决list中的中文显示乱码 使用decode('string_escap')将数据库查询返回的将带转义的字节码字符串转换为成utf-8中文
- php lcg_value与mt_rand生成0~1随机小数的效果比较
因工作需要使用PHP生成0~1随机小数,之前写过一篇<php生成0~1随机小数方法>,基于mt_rand()及mt_getrandmax()实现. 后来有网友评论,php原生方法lcg_v ...
- ubuntu配置neuwork网络
ubuntu 网络配置 检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. ...
- OVS常用命令与使用总结
说明 在平时使用ovs中,经常用到的ovs命令,参数,与举例总结,持续更新中… 进程启动 1.先准备ovs的工作目录,数据库存储路径等 mkdir -p /etc/openvswitch mkdir ...
- 您只能在 HTML 输出中使用 document.write。如果您在文档加载后使用该方法,会覆盖整个文档
https://blog.csdn.net/qq_37425546/article/details/54868908
- PSP耗时
- 测试那些事儿-Jmeter介绍及使用
Jmeter与LR有啥区别? Jmeter工具组成部分: 1.资源生成器:用于生成测试过程中服务器,负载机的资源代码.(LR中的VuGen) 2.用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指 ...