使用未定义的class错误【不完整类型的使用】

在h4头文件里我声明了类c

在y4源文件里我定义了类C

 

现在我在A类的头文件里声明C类型的成员变量。

 

在源文件中的构造函数中去初始化对象成员变量c

 

报错

 

我总结一下错误:

这是因为我们使用了不完整类型的原因。它缺乏足够的信息例如长度去描述一个完整的对象。

 不完整类型举例

1.class base

2.struct test

3.未知长度的数组extern int a[];

base和test只给出了声明,没有给出定义。

1.不完整类型必须通过某种方式补充完整,才能使用它们进行实例化

2.否则只能用于定义指针或引用,因为此时实例化的是指针或引用本身,不是base或test对象

综上所述:

当一个类A中需要使用另外一个类C作成员变量的时候,被用作成员变量的类C必须是已经定义的,否则A在构造时无法确定所需的内存空间。 

如果类C是在另外一个头文件C.h中声明的,如果在A的定义前加上"class C;",也只是对C进行了声明而非定义,A依然不知道以C为数据类型的成员变量需要多少内存空间。

解决方法:

1.在A.h中#include"C.h"

2.在A的定义中把C改成C*,把A中的相应成员变量的数据类型设置为B*,因为指针的大小是恒定的,在64位系统中为4字节,所以这时A的空间大小是已知的,就不会引起错误。

修改之后的代码:

头文件:

class C;
class A {

public:
	A();
	A(int , int);
	void print();
	int f4();
private:
	int a;
	int b;
	 C * c ;

};

 源文件:

#include"h2.h"
#include"h4.h"
#include <iostream>
using namespace std;
A::A() {
	a = 8;
	b = 9;
    c = & C();
	
	
}
A::A(int n1 , int n2) {
	a = n1;
	b = n2;
	c = & C();
}
void A::print() {
	cout << "我是老A\n";
}
int A::f4() {
	return a + b;
}


版权声明:本文为zhang2362167998原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。