Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基类的访问者模式 我试图在C++ 中实现访问者模式_C++_Polymorphism_Visitor Pattern - Fatal编程技术网

基类的访问者模式 我试图在C++ 中实现访问者模式

基类的访问者模式 我试图在C++ 中实现访问者模式,c++,polymorphism,visitor-pattern,C++,Polymorphism,Visitor Pattern,在将对象作为基类处理时,如何使用此模式?我希望访问者能够解析类层次结构。在我的特定情况下,不是我给出的示例,我想将一个对象数组解析为一个json列表,其中每个对象都有父类成员和特定子类成员。访客模式不是这里的正确方法吗 #include <iostream> #include <vector> class Animal; class Dog; class Cat; class Visitor { public: virtual void visit(Anima

在将对象作为基类处理时,如何使用此模式?我希望访问者能够解析类层次结构。在我的特定情况下,不是我给出的示例,我想将一个对象数组解析为一个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);
     }
}
#包括
#包括
类动物;
班犬;
猫类;
班级访客{
公众:
虚拟无效访问(动物*a)=0;
虚拟无效访问(Dog*d)=0;
虚拟无效访问(Cat*c)=0;
};
结构动物{
无效接受(访客){v.访问(本);}
INTA;
受保护的:
动物(intan):a(an){}
};
结构狗:动物{
狗(intdn,intan):动物(an),d(dn){}
无效接受(访客){v.访问(本);}
int d;
};
结构猫:动物{
猫(国际cn,国际an):动物(an),c(cn){}
无效接受(访客){v.访问(本);}
INTC;
};
结构具体访问者:访问者{
无效访问(动物*a){

std::cout你也应该使
接受
虚拟化。

这里不需要模板,你应该学习
虚拟
成员函数。@Someprogrammerdude我编辑代码改为使用虚拟,但这仍然不能解决我的问题是这样做的