当我尝试创建类似于此的目录结构时,遇到了两个类相互认识的问题:
这是我的Base
课程,其中包括 和 的常见File
元素Folder
。请注意,为了这个问题,我省略了 getter 和 setter、构造函数和析构函数、#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;
};
这是可以正常工作的课程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) { ... }
问题很明显。首先,父母应该始终是 a Folder
,它不能是 a File
。但是,我必须使用Base
sinceFile
并且Base
显然无法知道Folder
.
另外,由于 my Base
and File
don't know 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
}
}
我从思考中头疼,我该如何解决这个问题?
编辑:我不想要一种骇人听闻的方式来获得我正在寻找的结果,我想在我的设计中找到错误。这些东西是如何为 windows 或 unix 设计的?