有一个C代码,我们试图将其转换为C ++代码。有两个继承层次结构,由C通过switch..case管理。它已被转换为在C ++中使用虚函数。现在,这两个层次结构必须相关。例如,A类涉及A1,B类涉及B1 ....其中A,B,C属于层次1,A1,B1,C1属于层次2。 在C代码中,这是通过在A,B,C中存储层次结构2的标记字段(或switch..case中使用的类型字段)来实现的。有人可以指导我如何干净地实现这个C ++吗?
在C
enum NodeTag1
{
A_Node
, B_Node
....
};
enum NodeTag2
{
A1_Node
, B1_Node
....
};
struct Node
{
NodeTag1 tag1;
};
struct A
{
NodeTag1 tag1;
NodeTag2 tag2;
..other members...
};
struct B,C看起来都一样。
现在假设有10个函数(f1,f2 ..)使用NodeTag1进行切换..情况 在C ++中
class Node { //10 virtual functions (f1,f2 ..)};
class A : public Node { // 10 virtual function( f1, f2.. ) };
class B : public Node { // 10 virtual function( f1, f2.. ) };
现在有一个这样的函数,从层次结构1的实例调用。
int decide( NodeTag2 tag2 )
{
switch(tag2)
{
...
}
}
我如何在C ++中实现这一目标?
谢谢, 戈库尔。
答案 0 :(得分:1)
如果通过“涉及”表示创建常用方法是factory method。这是A,B和C类中的虚函数,它返回A1,B1或C1的对象。
class A
{
virtual A1 GetRelated() { return new A1(); };
}
class B: public A
{
A1 GetRelated() { return new B1(); };
}
class A1;
class B1: public A1;
..
这当然假设A和A1类是B类和B1类的父类,您的层次结构可能不同。
答案 1 :(得分:1)
如果您不想在运行时创建对象。您可以使用以下方法。只创建一次对象。 由于您不需要访问类的成员,单个对象将完成您的工作;
class A
{
public:
virtual f()
{
printf("A");
}
static A* behaveLikeA();
static A* behaveLikeB();
};
class B : public A
{
public:
virtual f()
{
printf("B");
}
};
A* A::behaveLikeA()
{
static A ag;
return &ag;
}
A* A::behaveLikeB()
{
static B bg;
return &bg;
};
int main(int argc, char* argv[])
{
A* b = A::behaveLikeB();
b->f();
b = A::behaveLikeA();
b->f();
return 0;
}