实现c++访问者模式,避免循环依赖
Implement c++ visitor pattern avoiding circular dependency
我正在用c++实现这里描述的访问者模式。我有这样的文件结构:
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,并定义了上面链接中描述的accept方法。我对这些文件结构的问题是头之间的循环依赖关系。如果我用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上)我得到错误c2872 'visitor'歧义符号:
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);
}
在visitor.h
头文件中你不需要include,编译器只需要知道base
和derived
类的存在。这可以通过用类的声明替换#include
指令来轻松完成:
class base;
class derived;
在另外两个头文件中,你也不需要包含visitor.h
,只需将#include
替换为
class visitor;
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 如何在具有循环依赖的类中dynamic_cast?
- C++模板方法中的循环依赖关系
- 修复循环依赖项 c++17 标头
- 涉及全局对象的循环依赖C++
- 循环依赖,在继承类的情况下使用覆盖方法
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 错误 C2512 视觉C++(并且不是循环依赖项)
- CMake 外部和内部静态库的循环依赖关系
- 正在从继承中解析循环依赖项
- "std::shared_ptr"循环依赖关系是如何导致问题的
- 纯引用而不是weak_ptr来打破循环依赖关系
- "invalid use of incomplete type" .解决循环依赖关系
- 如何避免模板方法的循环依赖
- 循环依赖结构,使用前向声明时结构的错误重定义