0

我对 C++ 中的“头文件”有疑问,现在我有一个超类“节点”和三个子类“文件、目录、文件”

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&);
};

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

4

3 回答 3

0

对于访问者,您不需要包含标头,因为编译器不需要知道对象的大小。您可以简单地转发声明。

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. 然后在实现#include中访问者的标题。

另外考虑一下,我认为您可以取消visitX函数 as FileDirectory并且Link是所有类型的函数,Node不需要明确访问。

于 2013-09-13T15:18:47.330 回答
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 {..}
于 2013-09-13T10:44:06.170 回答
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" 
于 2013-09-13T10:46:59.290 回答