首页 > 解决方案 > 代码组织

问题描述

我有这个访问者模式实现:

class Visitor {
  public:
    Visitor() {}
    void visit(A *a){ a->doSomething(); }
    void visit(B *b){ b->doSomething(); }
};

class Base {
  public:
    Base() {}
    virtual void accept(Visitor *v) = 0;
};

class A: public Base {
  public:
    A():Base() {}
    void accept(Visitor *v) override { v->visit(this) };
    .....
};

class B: public Base {
  public:
    B():Base() {}
    void accept(Visitor *v) override { v->visit(this) };
};

问题在于,A并且B在访问者实现中具有不完整的类型。但我不想将实现放在单独的源文件中。

有没有办法把它放在一个头文件中?

标签: c++code-organizationvisitor-pattern

解决方案


做前向声明AB. 将您的visit(A*a);andvisit(B*b);移到访问者的类声明之外,并在AB类之后声明它。为避免重复符号,将其放入头文件,例如 Header.h:

//forward declarations
class A;
class B;

class Visitor {
public:
    Visitor() {}
    void visit(A *a);
    void visit(B *b);
};

class Base {
public:
    Base() {}
    virtual void accept(Visitor *v) = 0;
};

class A: public Base {
public:
    A():Base() {}
    void accept(Visitor *v) override { v->visit(this); };
    void doSomething(){};
};

class B: public Base {
public:
    B():Base() {}
    void accept(Visitor *v) override { v->visit(this); };
    void doSomething(){};
};

此声明应放在 cpp 文件中,以避免重复符号,例如将其添加到 main.cpp:

#include "Header.h"

//outside declarations of methods
void Visitor::visit(A *a){ a->doSomething(); }
void Visitor::visit(B *b){ b->doSomething(); }

推荐阅读