gpt4 book ai didi

c++ - 如何避免仅包含 header 的库中的循环依赖关系?

转载 作者:行者123 更新时间:2023-12-02 02:08:45 31 4
gpt4 key购买 nike

我正在开发一个仅包含 C++ 头文件的库。

代码中有几个部分遵循此模式:

holder.h

#pragma once

#include "sub.h"

struct Holder
{
void f();
Sub s;
};

sub.h

#pragma once

struct Holder;

struct Sub
{
void g(Holder& h);
};

#include "sub.ipp"

sub.ipp

#include "holder.h"

inline void Sub::g(Holder& h)
{
h.f();
}

sub.h 使用前向声明避免了对 Holder 的循环依赖。但是,在 holder.h 中,由于 Holder 类包含 Sub 成员,因此需要查看 Sub 的完整声明> 在 sub.h 中。然而,sub.h 引入了 sub.ipp 中的实现,该实现尚无法实例化,因为它需要 Holder 的定义和我们已经在 holder.h 中,所以我们不能再次包含它。

作为任何这些 header 的用户,我只想包含正确的 .h 文件,而不必担心手动包含正确的 .ipp文件位于奇怪的地方。

这个问题的标准解决方案是什么?

最佳答案

struct Sub
{
void g(Holder& h);
};

void Sub::g(Holder& h)
{
h.f();
}

非内联函数在仅包含 header 的库中无法正常工作,因为 header 通常包含在多个翻译单元中。您应该改用内联函数。


How can I avoid circular dependencies in a header only library?

您必须将函数的定义与类的定义分开。我的意思是,它们已经位于单独的文件中,但是定义类的 header 不能包含函数定义。这允许打破依赖循环。

这可能是一个品味问题,但我也不喜欢不能独立工作的“ipp” header 。

示例:

详细信息/holder_class_only.h

#pragma once
#include "detail/sub_class_only.h"
struct Holder
{
inline void f(); // note inline
Sub s;
};

detail/sub_class_only.h

#pragma once
struct Holder;
struct Sub
{
inline void g(Holder& h); // note inline
};

detail/holder_functions.h

#pragma once
#include "detail/holder_class_only.h"
void Holder::f()
{
}
#include "detail/sub_functions.h"

detail/sub_functions.h

#pragma once
#include "detail/sub_class_only.h"
#include "holder.h"
void Sub::g(Holder& h)
{
h.f();
}

sub.h

#pragma once
#include "detail/sub_class_only.h"
#include "detail/sub_functions.h"

holder.h

#pragma once
#include "detail/holder_class_only.h"
#include "detail/holder_functions.h"

注意:未经测试,可能包含错误。

关于c++ - 如何避免仅包含 header 的库中的循环依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68020388/

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