我对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&);
};
每个都在不同的头文件中,我想知道如何导入这些头文件
答案 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&)
函数的情况,那也很简单。在您的标头文件中,转发会在File
,Directory
和Link
的标头中声明Visitor类。然后在实现#include
标题中访问者。
考虑到这一点,我认为你可以取消使用visitX
作为File
,Directory
和Link
的所有类型Node
并且不要'需要明确访问。