gpt4 book ai didi

C++ 相互 header 包含和前向声明

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

如何允许两个类相互包含,以便它们可以从一个类转换为另一个类。

汽车.hpp

#ifndef CAR_HPP
#define CAR_HPP

#include "Truck.hpp"
class Car
{
public:
Car(int weight) : weight(weight) {}
Car(Truck data) : weight(ConvertFromTruck(data)) {}

private:
int weight;
int ConvertFromTruck(Truck data)
{
... //in real life there would be a lot more to transfer than just weight.
}
}
#endif //CAR_HPP

卡车.hpp

#ifndef TRUCK_HPP
#define TRUCK_HPP

#include "Car.hpp" //Obviously won't be included because of the CAR_HPP include guard
class Truck
{
public:
Truck(int weight) : weight(weight) {}
Truck(Car data) : weight(ConvertFromCar(data)) {}

private:
int weight;
int ConvertFromCar(Car data)
{
...//in real life there would be a lot more than just weight
}
}
#endif //TRUCK_HPP

main.cpp

#include "Car.hpp"
#include "Truck.hpp"

int main()
{
Car newCar(42);
Truck newTruck(newCar);

return 0;
}

很明显 Truck.hpp 不能真正包含 Car.hpp 因为 CAR_HPP 已经定义了。另外,Truck.hpp 无法转发声明 class Car;因为Truck(Car data)...需要完整类型,而前向声明的类不是完整类型。

看起来很相似:Forward declaration being ignored?但没有答案。

该主题声明不要有相互包含的 header 。 Forward Declarations and Includes

我会尽力避免这种情况,但我怎样才能实现一辆可以接收卡车并正确转换它的汽车以及一辆可以接收汽车并正确转换它的卡车?

有什么方法可以使用: operator Car() { ... }operator Truck() { ... }这样汽车就可以类型转换成卡车,反之亦然?

最佳答案

在声明中

int ConvertFromTruck(Truck data)

Truck需要是一个完整类型,这意味着 Truck 的类定义必须可供编译器使用。这就是你的问题所在。

幸运的是有一个解决方案:传递Truck通过const引用:

int ConvertFromTruck(const Truck& data)

这里编译器只需要 Truck不完整类型,以及前向类声明,而不是 #include就足够了。这在运行时也非常优越,因为您没有获取 Truck 的值拷贝。当函数运行时(尽管编译器可能会优化该拷贝)。

对构造函数(即 Car(const Truck& data) )和 Truck 执行相同的操作类也是如此。

请注意,我使用 const引用而不是非 const引用有两个原因(i)您希望能够修改传递的对象,以及(ii)匿名临时可以绑定(bind)到 const引用。

关于C++ 相互 header 包含和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42004488/

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