c++“不允许使用不完整的类型“

示例

  先贴上一段简单的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++“不允许使用不完整的类型“_第1张图片  
  错误的本质很简单:在一个类还没完全定义之前调用了该类。c++是自上而下编译的,走到Address whathappend;这一句的时候,发现Address 类并没有定义完整(从示例程序中,至少构造函数没有定义),没有定义完整的东西,都还不知道到底是个啥,编译器当然不敢用,所以报错。
  不过,按下面这样写,行。
  
c++“不允许使用不完整的类型“_第2张图片  
  原因也比较简单,类的指针不受类的内容影响,它只是个指针,指向你定义的一个类,至于这个类是个啥,它也不懂——也不需要懂。因此编译器是能够令其通过的。

你可能感兴趣的:(C++,c++,指针,编程语言)