关于"Node,File,Directory,Link"和"Visitor"
About "Node,File,Directory,Link" and "Visitor"
我对c++中的"head文件"有疑问,现在我有一个超类"Node"和三个子类"File,Directory,File"
class Node {
public:
//declare common interface here
void setName(string& name);
const string getName();
// const Protection& getProtection();
// void setProtection(const Protection&);
void setCDate(char* cDate);
char* getCDate();
long size();
void streamIn(istream&);
void streamOut(ostream&);
Node* getChild(int index);
virtual void adopt(Node* child);
virtual void orphan(Node* child);
virtual void accept(Visitor&) = 0;
static void destroy(Node*);
protected:
Node();
Node(const Node&);
virtual ~Node();
virtual bool isWritable() = 0;
private:
string name;
char* cDate;
};
class Directory : public Node {
public:
Directory();
Directory(string path);
//redeclare common interface here
void setName(string& name);
string getName();
void setCDate(char* cDate);
char* getCDate();
long size();
Node* getChild(int index);
virtual void adopt(Node* child); //add children
virtual void orphan(Node* child); //let the subnode be free
virtual void accept(Visitor&);
private:
list<Node*> _nodes; //hold its subnode
string& name;
char* cDate;
};
文件和链接与类目录相同,这里是类访问者:
class Visitor{
public:
virtual ~Visitor() {}
virtual void visitNode(Node*) = 0;
virtual void visitFile(File*) = 0;
virtual void visitDirectory(Directory*) = 0;
virtual void visitLink(Link*) = 0;
protected:
Visitor();
Visitor(const Visitor&);
};
它们中的每一个都在不同的头文件中,我想知道如何导入这些头文件
对于访问者,您不需要包含标头,因为编译器不需要知道对象的大小。 您可以简单地转发声明。
class Node;
class File;
class Directory;
class Link;
class Visitor{
public:
virtual ~Visitor() {}
virtual void visitNode(Node*) = 0;
virtual void visitFile(File*) = 0;
virtual void visitDirectory(Directory*) = 0;
virtual void visitLink(Link*) = 0;
protected:
Visitor();
Visitor(const Visitor&);
};
但是,编译器需要知道实现的大小,但您可以将它们包含在 cpp 文件中。
编辑:对于您的accept(Vistor&)
函数,这也非常简单。 在你的头文件中,在 File
、Directory
和 Link
的头文件中声明 Visitor 类。 然后在实现中#include
访问者的标头。
另外考虑到这一点,我认为您可以取消visitX
函数,因为File
,Directory
和Link
都是Node
类型,不需要明确访问。
通常,
如果您有两个头文件(例如 1.h 和 2.h),它们都位于同一文件夹中
"头文件 1.h"
class A {..}
"头文件 2.h"
class B {..}
如果您想在 2.h 中使用 A 类,请在 2.h 中添加以下行,
#include "./1.h" // Change the path if the header is some other directory
所以你的 2.h 文件会变成,
#include "./1.h"
class B {..}
如果您的文件被命名为:directory.h、file.h、link.h、visitor.h,则必须在 file.h 和 link.h 文件的开头包含 directory.h:
#include "directory.h"
在这些文件中,使用在 directory.h 中定义的 Node 类。同样,在 visitor.h 中,您必须包含定义了 Visitor 定义中使用的类的所有文件:
#include "directory.h"
#include "file.h"
#include "link.h"
相关文章:
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- qt QWidget::closeEvent link issue
- CMake:如何添加不是"link"依赖项的依赖项
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- Visual Studio 中的 lcr 游戏 c++ LINK 2019 错误
- Link Paho MQTT CMake
- 为什么我们需要在 Visitor 模式中 accept(),为什么我们不能直接调用 visitor.visit()?
- Antlr4 c++ visitor API
- Mac OS c++ Link OpenCV and libtiff
- cmake_list中的link openssl静态
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- libsqlite3.dylib link with CMake
- STD :: ASYNC带有GCC 7.2需要Pthread Link选项
- "The ordinal 344 could not be located in the dynamic link library"
- G++ link against psapi in Cygwin
- 哪种算法需要"visitor"(提升库中的术语)?
- C++运行时组件(通用 Windows)项目生成错误"LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'"
- 使用模板实现"visitor pattern"
- 关于"Node,File,Directory,Link"和"Visitor"