包含派生类型指针的基 class
base class containing pointer of derived type
我正在尝试用 C++ 为文件对象建模。我将所有文件对象视为 "nodes",由 CNode class 表示。这些节点可以是文件,也可以是CFile和CDirectory代表的目录,分别继承自CNode class.
不管节点是什么类型的节点,我都希望它有一个代表节点父目录的 CDirectory 对象的句柄。所以有两种观点不应混淆:
1. 看到 CFile 和 CDirectory 继承自父 class CNode 的编程视图
2. 看到位于父目录中的文件和目录的真实世界视图(仅供参考,位于根目录的 files/directories 出于显而易见的原因会有一个 NULL CDirectory 句柄)
大意是当CFile对象或CDirectory对象实例化路径时,例如/path/to/my/file.txt,如果"to"目录不存在,则与路径中命名的子目录和文件一起创建。在销毁时,对象创建的 directories/file 将被删除,使文件系统保持在使用这些对象之前的状态——在一种情况下。条件是,如果本例中的文件"file.txt,"被写入,"file.txt"和在创建"file.txt"过程中创建的目录将不会被删除。
为实现此行为,表示 "file.txt" 的 CFile 对象将使用从其基础 class (CNode) 继承的 CDirectory * 并调用其 "setWrittenToFlag()",后者将为parent 的父目录等等。这是一个仅包含在 CDirectory class 中的方法,因此对于每个节点都具有其父目录的句柄以便它可以调用此方法很重要。
所有内容都已编码,但我无法编译,原因如下:
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 解决方案——除非有意义,否则我不想投射。
假设每个 class 都有特定于那个 class/node-type 的方法,所以我不想组合 classes 或类似的东西。
编辑:
感谢您的快速反应家伙!解决方案原来是从 CNode.hpp 中删除 #include "CDirectory.hpp" 因为前向声明在那里,但这会导致 .cpp 文件中包含 "CNode.hpp" 和随后的 "CDirectory.hpp" 因为 "CDirectory.hpp" 不再存在 - 所以你必须将 #include "CDirectory.hpp" 行添加到那些单独的 .cpp 文件中。
不要在 CNode.h
中包含 CDirectory.h
。通过包含它,您强制编译器在看到 CNode
定义之前查看 CDirectory
的定义,它是 CNode
的子项。
只需转发声明 CDirectory
,正如您已经在做的那样。
我正在尝试用 C++ 为文件对象建模。我将所有文件对象视为 "nodes",由 CNode class 表示。这些节点可以是文件,也可以是CFile和CDirectory代表的目录,分别继承自CNode class.
不管节点是什么类型的节点,我都希望它有一个代表节点父目录的 CDirectory 对象的句柄。所以有两种观点不应混淆: 1. 看到 CFile 和 CDirectory 继承自父 class CNode 的编程视图 2. 看到位于父目录中的文件和目录的真实世界视图(仅供参考,位于根目录的 files/directories 出于显而易见的原因会有一个 NULL CDirectory 句柄)
大意是当CFile对象或CDirectory对象实例化路径时,例如/path/to/my/file.txt,如果"to"目录不存在,则与路径中命名的子目录和文件一起创建。在销毁时,对象创建的 directories/file 将被删除,使文件系统保持在使用这些对象之前的状态——在一种情况下。条件是,如果本例中的文件"file.txt,"被写入,"file.txt"和在创建"file.txt"过程中创建的目录将不会被删除。 为实现此行为,表示 "file.txt" 的 CFile 对象将使用从其基础 class (CNode) 继承的 CDirectory * 并调用其 "setWrittenToFlag()",后者将为parent 的父目录等等。这是一个仅包含在 CDirectory class 中的方法,因此对于每个节点都具有其父目录的句柄以便它可以调用此方法很重要。
所有内容都已编码,但我无法编译,原因如下:
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 解决方案——除非有意义,否则我不想投射。 假设每个 class 都有特定于那个 class/node-type 的方法,所以我不想组合 classes 或类似的东西。
编辑: 感谢您的快速反应家伙!解决方案原来是从 CNode.hpp 中删除 #include "CDirectory.hpp" 因为前向声明在那里,但这会导致 .cpp 文件中包含 "CNode.hpp" 和随后的 "CDirectory.hpp" 因为 "CDirectory.hpp" 不再存在 - 所以你必须将 #include "CDirectory.hpp" 行添加到那些单独的 .cpp 文件中。
不要在 CNode.h
中包含 CDirectory.h
。通过包含它,您强制编译器在看到 CNode
定义之前查看 CDirectory
的定义,它是 CNode
的子项。
只需转发声明 CDirectory
,正如您已经在做的那样。