【问题标题】:Avoiding circular includes with shared_ptrs使用 shared_ptrs 避免循环包含
【发布时间】:2017-12-29 08:20:55
【问题描述】:

我有一对我似乎无法避免循环包含问题的类:

point.h

#include group.h // Needed for GroupOfPoints::weak_ptr

class Point
{
    private:
        double _x;
        double _y;

        // Groups of points that this point belongs too
        std::vector<GroupOfPoints::weak_ptr> _groups;

    public:
        typedef std::shared_ptr<Point> shared_ptr;
        typedef std::weak_ptr<Point> weak_ptr;

        Point(); // Constructor
        // etc...
}

group.h

#include point.h // Needed for Point::shared_ptr

class GroupOfPoints
{

    private:
        // Collection of points that fall in this group
        std::vector<Point::shared_ptr> _points;

    public:
        typedef std::shared_ptr<GroupOfPoints> shared_ptr;
        typedef std::weak_ptr<GroupOfPoints> weak_ptr;

        GroupOfPoints(); // Constructor
        // etc...

}

我知道共享指针和弱指针存在于对偶中以防止循环所有权,但是在指针是成员变量的情况下(即必须在标头而不是实现文件中定义),我如何才能利用没有循环包含的对偶?

【问题讨论】:

  • 转发 - 声明一个类 (class Foo;) 而不是在其中一个文件中包含标题?
  • class GroupOfPoints; class Point { std::vector&lt;std::weak_ptr&lt;GroupOfPoints&gt;&gt; _groups; };
  • 啊,我没有意识到可以通过类来做到这一点。我只熟悉函数的前向声明
  • "我了解共享指针和弱指针存在于对偶中以防止循环所有权" 不。错。正确的设计可以防止循环所有权

标签: c++ pointers smart-pointers circular-dependency


【解决方案1】:

首先摆脱这个:

typedef std::shared_ptr<Point> shared_ptr;
typedef std::weak_ptr<Point> weak_ptr;

我不明白这一点。

std::shared_ptr&lt;Foo&gt;Foo::shared_ptr 更清晰。

现在,转发声明 class Point;class Group;。这可以代替#include &lt;point.h&gt;,或之前,包括其他头文件。

接下来确保你的构造函数定义,他们可以看到另一个类的整个声明;无论你打电话给make_shared&lt;Foo&gt;new Foodelete Fooshared_ptr&lt;Foo&gt;(pFoo)。共享指针类型在构造时擦除销毁。

【讨论】:

  • 谢谢。 typedef 的重点是因为我以前使用 boost 指针,当我不得不将所有代码切换到 C++11 智能点时养成了这个习惯——谁知道:也许 C++20 会有一些疯狂的新 shared_ptr类型?并且构造函数将在 cpp 文件中或更下方定义。似乎没有必要将它们完整地写出来以表达我的观点
  • @marc typedefs 可以成为类型的别名outside
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2021-12-01
  • 2015-09-05
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多