读书人

c++文件结构的有关问题

发布时间: 2013-09-17 13:35:59 作者: rapoo

c++文件结构的问题


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 Link : public Node {
public:
Link(Node*);
//redeclare common Node interface here
Node* getChild(int index);
virtual void accept(Visitor&);

private:
Node* _subject;
};


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 File : public Node {
public:
File();
//redeclare common interface here
void setName(string& name);
string& getName();
void setCDate(char* cDate);
char* getCDate();


long size();
virtual void accept(Visitor&);
private:
string& name;
char* cDate;
};


如上代码所示,File,Directory,LInk是Node的子节点,Visitor中有Node,File,Directory,Link的引用,而Node,file,directory,link中又有visitor的引用,该如何引入头文件,各个class是分开的各个头文件,求大神指教啊。 c++
[解决办法]
相互引用吗。

你考虑增加common

生命在h定义在cpp

引用之前在类的前面声明引用的类型。
[解决办法]
在定义之前先申明一个类,这样include就不会有问题了
[解决办法]
a.h
#include b.h
class A
{
void foo(B*);
};

b.h
class B;

b.cpp
#include a.h
class B
{
void bar(A*);
};

[解决办法]
引用头文件时用#ifdef
#endif 包围头文件,需要使用之前先声明

读书人网 >C++

热点推荐