包含派生类型的指针的基类
base class containing pointer of derived type
我正在尝试在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
,就像您已经在做的那样。
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如果基类包含双指针成员,则派生类的构造函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 指向基类派生类的 std::unique_ptr 的指针
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- std::variant vs指向C++中异构容器基类的指针
- 模板化函数或具有指向基类的指针的函数
- 指向基类的唯一指针
- C++函数解析基类指针到派生类指针
- 指向基类的指针的 std::vector 的深层副本
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 无法从指针派生类转换为指针基类(多态性)
- 使用指针基类的=操作符的多态性