智能指针,typedef和前向声明

时间:2011-06-16 19:57:11

标签: c++ typedef smart-pointers

我喜欢使用智能指针,并且已经看到了一些代码,这些代码很好地利用了typedef s使它们变得更漂亮。例如:

struct A {
    typedef boost::shared_ptr<A> pointer;
};

允许我写:A::pointer a(new A);

但我在typedef幸福中遇到了一个小问题: - /,前言......

想象一下这种情况:

struct B;
struct A {
    boost::shared_ptr<B> b_;
};

struct B {
    boost::shared_ptr<A> a_;
};

运作良好,但我想清理一下。不幸的是,无效

struct B;
struct A {
    typedef boost::shared_ptr<A> pointer;
    B::pointer b_; // <-- error here
};

struct B {
    typedef boost::shared_ptr<B> pointer;
    A::pointer a_;
};

我理解为什么在文件中的那一点,编译器没有信息表明B实际上有一个名为pointer的类型。

我有一种感觉,我至少在某些方面坚持使用旧方法,但我很想听到一些聪明的想法。

3 个答案:

答案 0 :(得分:6)

使用typedef并不会让它变得更漂亮 - 它毫无价值。您可以将shared_ptr设为不完整类型,因此只需使用shared_ptr<B>

答案 1 :(得分:4)

如果要共享typedef,可能需要使用命名空间来声明它们:

struct A;
struct B;

namespace Aimpl {
  typedef boost::shared_ptr<A> pointer;
}

namespace Bimpl {
  typedef boost::shared_ptr<B> pointer;
}

struct A {
    Bimpl::pointer b_;
};

struct B {
    Aimpl::pointer a_;
};

答案 2 :(得分:3)

我可以想到两种方法:

  • 您可以创建ptr_for模板并使用类似ptr_for<B>::type b_ptr_;
  • 的模板
  • 你可以对两个结构进行pimpl(我知道这可能不是你想要的)所以实现的定义都可以出现在AB的定义之后。< / LI>