内部typedef和循环依赖

时间:2013-11-06 00:49:19

标签: c++ include typedef circular-dependency

我有两个类,其函数将typedefed指针作为返回值和参数。即:

class Segment;

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    typedef Fwk::Ptr<Location> Ptr;
    // ===== Class Typedefs End =====
    void segmentIs(Segment::Ptr seg);
    /* ... */
}

和     班级位置;

class Segment : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Segment const> PtrConst;
    typedef Fwk::Ptr<Segment> Ptr;
    // ===== Class Typedefs End =====
    void locationIs(Location::Ptr seg);
    /* ... */
 }

这可以理解地生成链接器错误......各个类的前向声明无法修复。我怎样才能转发声明PtrPtrConst typedef,同时将这些typedef保持在类的内部(即我想写Location::Ptr来引用位置指针类型)?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

其中有一个隐藏的元函数,它采用类型T并返回Fwk::Ptr< T >。您已经两次实现了这个元函数。在类中实现它会引入元函数对类的错误依赖。

要删除此虚假依赖项,请在其他任何内容之前实现元函数。

template< typename T >
using FwkPtr = Fwk::Ptr< T >;

(编辑:这是一个C ++ 03风格的metafuction。

template< typename T >
struct FwkPtr {
    typedef Fwk::Ptr< T > type;
};

然后你会引用FwkPtr< Segment >::type,或者如果元函数应用于模板参数或其结果typename FwkPtr< T >::type。)

如果将来SegmentLocation被模板化,因此他们的Ptr成员可能是其他成员,那么由于评估延迟,问题就会消失。但修复仍然有效,并且它在概念上仍然有效。

你可能(最终)让元函数计算其他东西,或者有多个元函数。关键是你不需要整个类来完成它,它不是由类封装的功能。

另一方面,如果参数始终是Fwk::Ptr< Segment >Fwk::Ptr< Location >,您可以这样指定它们并回避问题。

答案 1 :(得分:0)

您无法访问尚未声明的类型

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    typedef Fwk::Ptr<Location> Ptr;
    // ===== Class Typedefs End =====

    // this is illegal
    void segmentIs(Segment::Ptr seg);
};

相反,请尝试在课堂外输入typedef。

class Segment;
class Location;
typedef Fwk::Ptr<Segment>  SegmentPtr;
typedef Fwk::Ptr<Location> LocationPtr;

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    // ===== Class Typedefs End =====
    void segmentIs(const SegmentPtr& seg);
};