クラスの階層があります(Base
および娘A
、B
などC
)。階層ツリーは有限ではありません。の動的タイプに動的に適応するために、既知のビジター パターンを使用してを訪問することができます。ビジターには のようなタイプがあります。このような:Base*
Base*
BaseVisitor
struct BaseVisitor;
struct Base {
virtual void accept(BaseVisitor &v) = 0;
};
struct A : Base {
int a;
A(int x) : a(x) {}
~A(void) = default;
void accept(BaseVisitor &v) override {
v->visit(*this);
}
};
struct B : Base {
float b;
B(void) : b(314.f) {}
~B(void) = default;
void accept(BaseVisitor &v) override {
v->visit(*this);
}
};
struct BaseVisitor {
void visit(Base &) {}
void visit(A &a) {
std::cout << "just visited a A; a=" << a.a << std::endl;
}
void visit(B &b) {
std::cout << "just visited a B; b=" << b.b << std::endl;
}
};
BaseVisitor
ここで、新しい訪問者を継承するために抽象クラスを作成したいと思います。問題は、抽象クラスを定義するときに発生します。
struct ABaseVisitor {
virtual void visit(Base &) = 0; /* huh? */
};
何か考えはありますか?