关于“节点,文件,目录,链接”和“访客”

时间:2013-09-13 10:18:20

标签: c++ design-patterns

我对c ++中的“头文件”有疑问,现在我有一个超类“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&);
};

每个都在不同的头文件中,我想知道如何导入这些头文件

3 个答案:

答案 0 :(得分:0)

通常,如果你有两个头文件,例如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 {..}

答案 1 :(得分:0)

如果您的文件名为:directory.h,file.h,link.h,visitor.h,那么您必须在file.h和link.h文件的开头包含directory.h:

#include "directory.h"

就像在这些文件中一样,使用了在directory.h中定义的节点。同样,在visitor.h中,您必须包含定义Visitor定义中使用的类的所有文件:

#include "directory.h"  
#include "file.h"  
#include "link.h" 

答案 2 :(得分:0)

对于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并且不要'需要明确访问。