包含派生类型的指针的基类

base class containing pointer of derived type

本文关键字:指针 基类 类型 派生 包含      更新时间:2023-10-16

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

无论节点的节点类型如何,我都希望它有一个表示节点父目录的 CDirectory 对象的句柄。因此,有2种观点不应混淆: 1. 从父类 CNode 继承 CFile 和 CDirectory 的编程视图 2. 查看位于父目录中的文件和目录的真实世界视图(仅供参考,由于显而易见的原因,位于根目录的文件/目录将具有空 CDirectory 句柄)

大的想法是,当CFile对象或CDirectory对象使用路径实例化时,例如/path/to/my/file.txt,如果"to"目录不存在,它将与路径中命名的子目录和文件一起创建。销毁时,对象创建的目录/文件将被删除,使文件系统处于使用这些对象之前的状态 - 在一个条件下。条件是,如果在此示例中将文件"file.txt"写入"file.txt",则不会删除在创建"file.txt"的过程中创建的目录。 为了实现此行为,表示"file.txt"的 CFile 对象将使用它从其基类 (CNode) 继承的 CDirectory * 并调用其"setWriteToFlag()",该对象将递归地调用父目录的父目录等相同的方法。这是一个仅包含在 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

主.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文件中。

不要在CNode.h中包含CDirectory.h。通过包含它,你可以强制编译器在看到定义之前看到CDirectory的定义,它是CNode的子CNode

只需向前声明CDirectory,就像您已经在做的那样。