gpt4 book ai didi

C++:由于#include 循环,无法将对象实例传递给另一个类

转载 作者:行者123 更新时间:2023-11-30 01:26:30 25 4
gpt4 key购买 nike

假设我有 2 个类:

// a.h
#ifndef A_H
#define A_H

#include "b.h"

class A {
public: void a() {
B* b = new B(this);
}
}

#endif


// b.h
#ifndef B_H
#define B_H

#include "a.h"

class B {
public: B(A* a) {
// ...
}
}

#endif

此代码将引发错误A has not been declared,因为类 A 引用了类 B,而后者又引用了尚未在 a.h 中声明的类 A。

那么如何将 A 的实例传递给 B?

最佳答案

你需要

  1. B构造函数的传值参数改为指针或引用*
  2. B::B 的定义移到 cpp 文件中(这会消除对 A 定义的任何直接依赖,并允许您
  3. 前向声明 A in B.h :

    // b.h
    #ifndef B_H
    #define B_H

    class A;

    class B {
    public: B(const A& a) {
    // ...
    }
    }

    #endif

    // b.cpp

    #include "b.h"
    #include "a.h"

    public B::B(const A& a) {
    // ...
    }

请注意,我为 A& 构造函数参数添加了一个 const 限定符,因为我假设您不想修改 a B 的构造函数。

当然,您也可以反过来玩,将 A::a 的定义和相应的 #include "b.h" 移动到 a 中。

*您很可能无论如何都应该这样做,因为您不太可能希望在那里按值传递 A 对象。按值传递对象意味着隐式创建对象的拷贝并将其压入堆栈。哪个

  • 意味着对参数对象所做的更改不会影响原始对象,这通常不是您想要的,因此是错误的来源,
  • 包括创建和销毁一个临时的,
  • 通常比引用/指针消耗更多的内存,
  • 打开通往object slicing的大门错误。

关于C++:由于#include 循环,无法将对象实例传递给另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com