gpt4 book ai didi

c++ - 来自基类的访问者模式

转载 作者:行者123 更新时间:2023-11-28 05:08:33 26 4
gpt4 key购买 nike

我正在尝试用 C++ 实现访问者模式 https://en.wikipedia.org/wiki/Visitor_pattern

在处理对象作为其基类时如何使用此模式?我希望访问者能够解析类层次结构。在我的具体情况下,不是我给出的示例,我想将一个对象数组解析为一个 json 列表,其中每个对象都有父类成员和特定的子类成员。访问者模式不是这里的正确方法吗?

#include <iostream>
#include <vector>

class Animal;
class Dog;
class Cat;

class Visitor {
public:
virtual void visit(Animal *a) = 0;
virtual void visit(Dog *d) = 0;
virtual void visit(Cat *c) = 0;
};

struct Animal {
void accept(Visitor &v) { v.visit(this); }
int a;
protected:
Animal(int an) : a(an) {}
};

struct Dog : Animal {
Dog(int dn, int an) : Animal(an), d(dn) {}
void accept(Visitor &v) { v.visit(this); }
int d;
};

struct Cat : Animal {
Cat(int cn, int an) : Animal(an), c(cn) {}
void accept(Visitor &v) { v.visit(this); }
int c;
};

struct ConcreteVisitor : Visitor {
void visit(Animal *a) {
std::cout << "Animal<" << a->a << ">";
}

void visit(Dog *d) {
std::cout << "Dog<" << d->d << ", ";
visit((Animal *)d);
std::cout << ">" << std::endl;
}

void visit(Cat *c) {
std::cout << "Cat<" << c->c << ", ";
visit((Animal *)c);
std::cout << ">" << std::endl;
}
};

int main() {
std::vector<Animal *> animals;
animals.push_back(new Dog(4, 5));
animals.push_back(new Cat(6, 7));

ConcreteVisitor v;
for (Animal *a : animals) {
a->accept(v);
}
}

这会打印出 Animal<5> Animal<7>

最佳答案

你也应该让 accept 成为虚拟的。

关于c++ - 来自基类的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com