关于"Node,File,Directory,Link"和"Visitor"

About "Node,File,Directory,Link" and "Visitor"

本文关键字:Visitor Link File Node 关于 Directory      更新时间:2023-10-16

我对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&)函数,这也非常简单。 在你的头文件中,在 FileDirectoryLink 的头文件中声明 Visitor 类。 然后在实现中#include访问者的标头。

另外考虑到这一点,我认为您可以取消visitX函数,因为FileDirectoryLink都是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"