在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
- 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;
- }