умные указатели, typedefs и предварительные объявления - PullRequest
13 голосов
/ 16 июня 2011

Мне нравится использовать умные указатели, и я видел немного кода, в котором хорошо используются typedef, которые делают их красивее. Например:

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 ]

6 голосов
/ 17 июня 2011

То, что использование typedefs не делает его красивее - это бесполезно.Вы можете сделать shared_ptr для неполного типа, поэтому просто используйте shared_ptr<B>.

4 голосов
/ 17 июня 2011

Если вы хотите поделиться typedefs, вы, вероятно, захотите использовать пространства имен для их объявления:

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_;
};
3 голосов
/ 17 июня 2011

Я могу думать о двух подходах:

  • Вы можете создать шаблон ptr_for и использовать его примерно так ptr_for<B>::type b_ptr_;
  • Вы можете объединить две структуры (Iзнаю, что это, вероятно, не то, что вы ищете), поэтому определения реализаций могут появляться после определений A и B.
...