c++ - 目录结构 - 文件和文件夹类应该相互了解吗?

标签 c++ class inheritance class-hierarchy

当我尝试创建类似于此的目录结构时,我遇到了两个类相互了解的问题:

Directory structure example

这是我的 Base 类,它包括 FileFolder 的公共(public)元素。 请注意,我省略了 getter 和 setter、构造函数和析构函数、#include#define 以及其他不相关的方法和属性(=几乎所有内容)为了这个问题:

class Base {
    private:
        string m_name;
        /* Both File and Folder have a parent,
         * but the parent can only be a Folder */
        Base* m_parent;
};

这是工作正常的 Folder 类:

class Folder : public Base {
    public:
        virtual void addChild(Base* child);
        virtual void removeChild(Base* child);
    private:
        vector<Base*> m_children;
};

然后 File 类没有任何新内容(除了一些与我的问题无关的文件相关内容,所以我将它们排除在外):

class File : public Base {
};

现在头文件看起来没问题,没有发生任何奇怪的事情。 但是,我的构造函数应该是这样的:

Base::Base(string name, Base* parent) { ... }
File::File(string name, Base* parent) { ... }
// parent should be of type Folder for Files too
Folder::Folder(string name, Folder* parent) { ... }

问题很明显。 首先,父级应该始终是 Folder,不能是 File。 但是,我必须使用 Base,因为 FileBase 显然不知道 Folder

此外,由于我的 BaseFile 不知道 Folder,他们不能称它为 addChild(Base* child ); 方法:

File::File(string name, Base* parent)
: m_name(name), m_parent(parent)
{
    if (parent) {
        parent->addChild(this); // Base doesn't have addChild()-method
    }
}

我一想就头疼,我该如何解决这个问题?

编辑:我不想用一种 hacky 的方式来获得我正在寻找的结果,我想找到我设计中的错误。 这些东西是如何为 windows 或 unix 设计的?

最佳答案

试试这个:

class Folder;

class Base {
    protected:
        Base(const string &name, Folder *parent);
    private:
        string m_name;
        Folder *m_parent;
    //no add or remove should go here
};

class Folder : public Base {
    public:
        Folder(const string &name, Folder *parent)
        :Base(name, parent)
        {
        }
        void addChild(Base* child);
        void removeChild(Base* child);
    /*...*/
};

class File : public Base {
    public:
        File(const string &name, Folder *parent)
        :Base(name, parent)
        {
        }
};

inline Base::Base(const string &name, Folder *parent);
:m_name(name), m_parent(parent)
{
    if (parent) {
        parent->addChild(this); // no problem!
    }
}

关于c++ - 目录结构 - 文件和文件夹类应该相互了解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262533/

相关文章:

C++ - 转换 float 组的 std::string

swift - 如何访问类中的对象

c++ - 空基类构建开销?

java - 未定义圆形对象构造函数

c++ - 程序重新启动时文件不解密,使用相同的加密 key

c++ - 带有 boost::posix_time 的值为 0 的日期时间(如在 MySQL 中)

c++ - 是否可以在基类构造函数之前运行成员初始值设定项?

c++ - 错误 C2955 : use of class template requires template argument list

class - 自定义下划线图像的 CSS3 过渡

Java:实例化还是继承?