• 使用未定义的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的空间大小是已知的,就不会引起错误。

    修改之后的代码:

    头文件:

    1. class C;
    2. class A {
    3. public:
    4. A();
    5. A(int , int);
    6. void print();
    7. int f4();
    8. private:
    9. int a;
    10. int b;
    11. C * c ;
    12. };

     源文件:

    1. #include"h2.h"
    2. #include"h4.h"
    3. #include
    4. using namespace std;
    5. A::A() {
    6. a = 8;
    7. b = 9;
    8. c = & C();
    9. }
    10. A::A(int n1 , int n2) {
    11. a = n1;
    12. b = n2;
    13. c = & C();
    14. }
    15. void A::print() {
    16. cout << "我是老A\n";
    17. }
    18. int A::f4() {
    19. return a + b;
    20. }

  • 相关阅读:
    关于F大学教学主体偏离的核心矛盾分析
    javaee网络原理初始
    Unity Audio
    skywalking 安装部署实践
    XAMPP的MySQL配置
    【179】Java实现堆排序
    Vue过渡效果组件、组件分发、组件ref使用
    BUUCTF WEB filejava
    成本翻倍,部署复杂!为什么要停止使用Kubernetes
    php实现分页功能跳转和ajax方式实现
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/126446589