gpt4 book ai didi

c++ - 使用 using 指令的循环依赖,其中前向声明不起作用

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

我正在使用一个无法解决此循环依赖的代码库:

foo.h

class Foo
{
public:
using Ptr = std::shared_ptr<Foo>;
using ConstPtr = std::shared_ptr<const Foo>;

void setter(const Bar::Ptr& bar_ptr) {};

private:
Bar::WeakPtr bar_ptr_;
};

酒吧.h

class Bar
{
public:
using Ptr = std::shared_ptr<Bar>;
using ConstPtr = std::shared_ptr<const Bar>;
using WeakPtr = std::weak_ptr<Bar>;

Bar(Foo::ConstPtr foo_ptr) : foo_ptr_(std::move(foo_ptr)) {};

private:
Foo::ConstPtr foo_ptr_;
};

它之前已编译,因为有一个外部 header ,其中:

using FooPtr = std::shared_ptr<Foo>;
using FooConstPtr = std::shared_ptr<const Foo>;
using BarPtr = std::shared_ptr<Bar>;

但是由于追求一致性,我想要 Foo::PtrFoo::ConstPtrBar::Ptr >。我有机会得到它吗?

Coliru

编辑:添加了之前丢失的 Bar::WeakPtr ,因为我认为我已经遇到了麻烦。

最佳答案

这可以说是 C++ 的缺陷。您不能仅声明类的某些公共(public)名称而不包含整个类定义。在这种情况下,恐怕您的循环依赖无法得到解决 - 至少不会以一种将来不会以某种方式困扰您的方式解决。

但是,作为替代方案,请考虑在主题类之外使用模板定义。它改变了术语的顺序,但没有改变整体含义:

template<class T>
struct PtrStruct {
using type = std::shared_ptr<T>;
};

template<class T>
using Ptr = typename PtrStruct<T>::type;

template<class T>
struct ConstPtrStruct {
using type = std::shared_ptr<const T>;
};

template<class T>
using ConstPtr = typename PtrStruct<const T>::type;

在此设置中,您的 Foo::Ptr变成Ptr<Foo>Foo::ConstPtr变成ConstPtr<Foo> 。您仍然可以:

  • 稍后替换 std::shared_ptr在一个地方有不同的东西 PtrStruct被定义为。只要使用的接口(interface)没有改变,其余代码将无需更改即可编译。
  • 专业PtrStruct具体T如果它应该与其他的有所不同。

关于c++ - 使用 using 指令的循环依赖,其中前向声明不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698562/

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