gpt4 book ai didi

c++ - 必须具有通用接口(interface)但必须根据传递的子类表现不同的函数(不知道它们是什么!)- C++

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:49 26 4
gpt4 key购买 nike

我正在编写 C++。

我有不同的类继承自基类(例如,A、B、C、D 都继承自 Z)。

我想编写一个函数,它接受 2 个类型(父类(super class)型)Z 的对象并执行一些操作。 (例如,我可以有 f(a, b)f(c,d),其中 a、b、c、d 是类型 A、B、 C、D)。

我希望(函数的)接口(interface)是通用的(没有 f_AB(a,b)f_CD(c,d))。

但是,实现可以(并且确实)根据所采用的类而有所不同。(例如,我确实有 f_AB 做一些特定于 A-B 的事情,f_CD做一些特定于 C-D 的事情,以及 f_ACf_BC 等)

根据我比较的类,子类的数据完全不同,具体操作也完全不同。

当我使用这个函数时,我不知道这两个参数的具体子类。假设我正在做类似的事情

for p in Z {
for q in Z
f(p, q) # p and q could be of any subclass of Z! and f must behave accordingly!
}

用 C++ 解决这个问题的最佳方法是什么?我无法结合多态性、虚方法、重载和动态转换来完全解决问题。

如果无法解决,是否可以通过放弃一些假设来解决? (就像使用继承一样,这实际上只是让通用引用循环遍历我的对象所需要的)

最佳答案

应该这样做:

class A;

class B;

class C;

class D;

class ZVisitor;


class Z
{
public:
virtual void Accept (ZVisitor *zv) = 0;

virtual void f(A* a) = 0;

virtual void f(B* b) = 0;

virtual void f(C* c) = 0;

virtual void f(D* c) = 0;
};

class A : public Z
{
public:

void Accept(ZVisitor *zv)
{
zv->Handle(this);
}

void f(A* a);

void f(B* b);

void f(C* c);

void f(D* c);
};

class B : public Z
{
public:
void Accept(ZVisitor *zv)
{
zv->Handle(this);
}

void f(A* a);

void f(B* b);

void f(C* c);

void f(D* c);
};

class C : public Z
{
public:

void Accept(ZVisitor *zv)
{
zv->Handle(this);
}


void f(A* a);

void f(B* b);

void f(C* c);

void f(D* c);
};

class D : public Z
{
public:
void Accept(ZVisitor *zv)
{
zv->Handle(this);
}

void f(A* a);

void f(B* b);

void f(C* c);

void f(D* c);
};

class ZVisitor
{
private:
Z *z;

public:

ZVisitor(Z *z)
{
this->z = z;
}

void Handle(A* a)
{
z->f(a);
}

void Handle(B* b)
{
z->f(b);
}

void Handle(C* c)
{
z->f(c);
}

void Handle(D* d)
{
z->f(d);
}

};

void f(Z *z1, Z *z2)
{
ZVisitor zvisitor(z2);

z1->Accept(&zvisitor);
}

关于c++ - 必须具有通用接口(interface)但必须根据传递的子类表现不同的函数(不知道它们是什么!)- C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400386/

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