当我尝试创建类似于此的目录结构时,我遇到了两个类相互了解的问题:
这是我的 Base
类,它包括 File
和 Folder
的公共(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
,因为 File
和 Base
显然不知道 Folder
。
此外,由于我的 Base
和 File
不知道 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/