示例
先贴上一段简单的c++类构造代码:
include<iostream>
using namespace std;
class Address;//提前声明类
class Address//声明类
{
private:
const char *m_province;//省份
const char *m_city;//城市
const char *m_district;//街区
public:
Address(const char *province, const char *city, const char *disrtict);//构造函数
~Address();//析构函数
};
Address::Address(const char *province, const char *city, const char *disrtict) :m_province(province), m_city(city), m_district(disrtict) {}
Address::~Address(){}
int main() {
Address *addr = new Address("shanxi","xian","yanta");
return 0;
}
以上代码是一个标准的声明类、新建对象的例子。以上代码比较特殊的点是:所有的字符指针都被声明成为了const char
常量型。因为我在vs2017上运行该程序,vs2017使用c++11标准,不能再用字符指针指向固定长度的字符串了,因此,类中的所有字符指针成员都被声明为常量型,此外,构造函数的形参也同样被声明为常量型。
因为成员变量是常量型,因此构造函数也只能像以上代码中的一样,使用构造函数初始化列表的方式进行初始化成员变量。
以上某种意义上都是废话,只是为了避免在理解以上代码的时候出现误差,接下来才是错误出现的主要可能原因:
使用了不存在的类
以上的代码中只存在一个类Address
,如果在该程序中以任何方式使用了除它以外的类的名称,必定会报错“不允许使用不完整的类型”。
比如说来一句下面这个,百分百报这个错误。
Student stu("zzy",24,92.5f);
该种情形还广泛存在于,使用头文件引入其他cpp文件中的类结果并没有引入成功
这种错误的结果中。
还有一种尴尬的情形就是,自已在用Address
类的时候拼写错误了。。
Adress addr("shanxi","xian","yanta");
因为拼写错了,编译器只会认为你自己另用了一个类,它还不认识,所以也必定报同样的错误。
在编译器尚未得到该类全部信息前调用该类
在定义类的时候稍加修改:
class Address
{
private:
const char *m_province;
const char *m_city;
const char *m_district;
Address whathappend; //加了一句这个
public:
Address(const char *province, const char *city, const char *disrtict);
~Address();
};
很快啊,报错了,错误的类型也是“不允许使用不完整的类型”。
错误的本质很简单:在一个类还没完全定义之前调用了该类
。c++是自上而下编译的,走到Address whathappend;
这一句的时候,发现Address
类并没有定义完整(从示例程序中,至少构造函数没有定义),没有定义完整的东西,都还不知道到底是个啥,编译器当然不敢用,所以报错。
不过,按下面这样写,行。
原因也比较简单,类的指针不受类的内容影响
,它只是个指针,指向你定义的一个类,至于这个类是个啥,它也不懂——也不需要懂。因此编译器是能够令其通过的。