包含派生类型

时间:2016-05-26 13:27:43

标签: c++ oop inheritance circular-dependency forward-declaration

我正在尝试用C ++建模文件对象。我将所有文件对象视为由CNode类表示的“节点”。这些节点可以是分别由CFile和CDirectory表示的文件或目录,它们继承自CNode类。

无论节点是什么类型的节点,我都希望它具有CDirectory对象的句柄,该对象表示节点的父目录。所以有2个观点不应混淆: 1.编程视图,它看到CFile和CDirectory继承自父类CNode 2.看到位于父目录中的文件和目录的真实世界视图(fyi,位于root的文件/目录由于显而易见的原因而具有NULL CDirectory句柄)

最大的想法是,当使用路径实例化CFile对象或CDirectory对象时,例如/path/to/my/file.txt,如果“to”目录不存在,则会创建它以及路径中指定的子目录和文件。在销毁时,将删除对象创建的目录/文件,使文件系统处于使用这些对象之前的状态 - 在一个条件下。条件是,如果本例中的文件“file.txt”被写入“file.txt”,则不会删除在创建“file.txt”的过程中创建的目录。 要实现此行为,表示“file.txt”的CFile对象将使用它从其基类(CNode)继承的CDirectory *并调用其“setWrittenToFlag()”,它将以递归方式为父级父目录调用相同的方法,等等。这是一个仅包含在CDirectory类中的方法,因此它对每个节点都有一个句柄来处理其父目录,以便它可以调用此方法。

所有内容都已编码,但由于此代码所示,我无法将其编译为一个原因:

CNode.hpp:

#ifndef _CNode_HPP_
#define _CNode_HPP_

#include "CDirectory.hpp"


class CDirectory;

class CNode
{
private:
    CDirectory * b;
};

#endif

CDirectory.hpp:

#ifndef _CDirectory_HPP_
#define _CDirectory_HPP_

#include "CNode.hpp"


class CDirectory : public CNode
{
};

#endif

main.cpp中:

#include <iostream>
#include "CNode.hpp"
#include "CDirectory.hpp"


int main()
{
    CDirectory dir;

    return EXIT_SUCCESS;
}

这会产生以下编译错误:

CDirectory.hpp:8: error: expected class-name before ‘{’ token

组合2 .hpp文件获取要编译的代码,但是为了与标准保持一致,我想将它们分开。我怎样才能使这个工作?有更好的设计吗?我只是在寻找优雅的OOD解决方案 - 除非有意义,否则我不想施展。 假设每个类都有特定于该类/节点类型的方法,因此我不想组合类或类似的东西。

编辑: 谢谢你快速回复!原因是解决方案是从CNode.hpp中删除#include“CDirectory.hpp”,因为前向声明存在,但这会导致包含“CNode.hpp”和随后的“CDirectory.hpp”的.cpp文件出现问题“因为”CDirectory.hpp“不再存在 - 所以你必须将#include”CDirectory.hpp“行添加到那些单独的.cpp文件中。

1 个答案:

答案 0 :(得分:2)

请勿在{{1​​}}中加入CDirectory.h。通过包含它,您可以强制编译器在看到CNode.h定义之前查看CDirectory的子项,CNode的子项。

只需向前宣布CNode,就像你现在所做的那样。