循环携带类依赖

时间:2014-03-05 07:03:15

标签: c++ class

以下是我的课程:

class Base {
public:
    template <typename T>
    static struct M {
        T* open(string name, Dir *parent = NULL) {
            if ( parent ) {
                return parent->open_child(name);
            } else {
                auto ans = new T(name);
                ans->open();
                return ans;
            }
        }
    };

    virtual void open() =0;
};

class Dir : public Base {
public:
    template <typename T>
    T* open_child(string name);

    void open();
};

class File : public Base {
public:
    void open();
};

此处,Dir课程要求Base原型,Base要求Dir。前向声明不起作用:只有适用于继承和方法调用的完整定义。 假设我想将这个代码放入3个头文件:Base.h,Dir.h和File.h. 我如何重新制作代码以打破循环依赖?

1 个答案:

答案 0 :(得分:0)

#include <string>

class Dir;

class Base
{
  public:
    template <typename T>
    struct M
    {
      T* open(std::string name, Dir* parent = nullptr);
    };
};

class Dir : public Base
{
  // Further definitions
};

// Implementation

template <typename T>
T* Base::M<T>::open(std::string name, Dir* parent)
{
  // Implementation goes here...
}