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

C++ 目录结构-文件和文件夹类应该相互了解吗?,c++,class,inheritance,class-hierarchy,C++,Class,Inheritance,Class Hierarchy,当我试图创建类似于以下内容的目录结构时,我遇到了两个类相互了解的问题: 这是我的Base类,它包括文件和文件夹的公共元素。 注意,为了这个问题,我省略了getter和setter、constructor和destructor,#includes和#defines以及其他不相关的方法和属性(=几乎所有内容): class Base { private: string m_name; /* Both File and Folder have a parent

当我试图创建类似于以下内容的目录结构时,我遇到了两个类相互了解的问题:

这是我的
Base
类,它包括
文件
文件夹
的公共元素。 注意,为了这个问题,我省略了getter和setter、constructor和destructor,
#include
s和
#define
s以及其他不相关的方法和属性(=几乎所有内容):

class Base {
    private:
        string m_name;
        /* Both File and Folder have a parent,
         * but the parent can only be a Folder */
        Base* m_parent;
};
下面是类
文件夹
,它工作正常:

class Folder : public Base {
    public:
        virtual void addChild(Base* child);
        virtual void removeChild(Base* child);
    private:
        vector<Base*> m_children;
};
现在头文件看起来不错,没有什么奇怪的事情发生。 然而,我的构造函数应该是这样的:

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) { ... }
问题是显而易见的。 首先,父级应该始终是
文件夹
,不能是
文件
。 但是,我必须使用
Base
,因为
File
Base
显然不知道
文件夹

另外,由于我的
Base
文件不知道
文件夹
,所以它们不能称之为
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
    }
}
我在想,我怎样才能避开这个问题呢

编辑:我不想用一种不切实际的方法来获得我想要的结果,我想找到我设计中的缺陷。 这些东西是如何为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!
    }
}

那么,Base到底有什么用呢?文件夹是你结构中唯一的东西,文件是唯一的混凝土叶子。为什么他们需要一个共同的基地?地图不是领土。把遗产扔掉。在界面中包装文件和文件夹常用的函数。@Mat为我回答得太晚表示歉意,我刚刚遇到其他人有同样的问题,并记住了我的这个问题。他们“需要”一个公共基类,因为他们90%相关,如果他们没有公共基类,我该如何在文件夹中创建向量
m_children
?它必须包含两种不同的类型,
文件
s和
文件夹
s。
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!
    }
}