实现c ++访问者模式,避免循环依赖

时间:2014-03-16 10:18:17

标签: c++ circular-dependency

我在C ++中实现访问者模式已经描述了here。我有这个文件结构:

Base.h
---------------
#ifndef BASE_H
#define BASE_H

#include "visitor.h"

class Base{
public: virtual void accept(const visitor& v)=0;
};

#endif

Derived.h
-----------------
#ifndef DERIVED_H
#define DERIVED_H

#include "base.h"
#include "visitor.h"

class Derived : Base {
public: virtual void accept(const visitor& v);
};

#endif

visitor.h
------------------
#ifndef VISITOR_H
#define VISITOR_H

#include "base.h"
#include "derived.h"

class visitor {
    void visit(const base& base);
    void visit(const derived& derived);
};

#endif

cpp文件只包含.h并定义上面链接中描述的acccept方法。我对这些文件结构的问题是标头之间的循环依赖。如果我用VS 2012编译它我得到这个错误:错误C2504:基类没有定义。谢谢你的建议,抱歉我的英文不好。

修改: 我已经更改了我的代码,如下所示:

Base.h
---------------
#ifndef BASE_H
#define BASE_H

//#include "visitor.h"
class visitor;

class Base{
public: virtual void accept(const visitor& v)=0;
};

#endif

Derived.h
-----------------
#ifndef DERIVED_H
#define DERIVED_H

#include "base.h"
//#include "visitor.h"

class visitor;

class Derived : Base {
public: virtual void accept(const visitor& v);
};

#endif

visitor.h
------------------
#ifndef VISITOR_H
#define VISITOR_H

//#include "base.h"
//#include "derived.h"

class base;
class derived;

class visitor {
    void visit(const base& base);
    void visit(const derived& derived);
};

#endif

但是现在,在cpp实现上(在base.cpp和derived.cpp上)我得到了erorr c2872' visitor' ambiguos符号:

Base.cpp
---------
#include "base.h"
void base::accept(const visitor& v){ // on this line i get error c2872
   v.visit(this);
}

Derived.cpp
---------
#include "derived.h"
void derived::accept(const visitor& v){ // on this line i get error c2872
   v.visit(this);
}

1 个答案:

答案 0 :(得分:7)

visitor.h头文件中,您不需要包含,编译器只需要知道basederived类存在。这可以通过将#include指令替换为类的声明来轻松完成:

class base;
class derived;

在其他两个标题文件中,您不需要visitor.h包含,只需将#include替换为

class visitor;