有一个 C 代码,我们正在尝试将其转换为 C++ 代码。有两个继承层次结构,由 C 通过 switch..case 管理。这已被转换为使用 C++ 中的虚函数。现在,在某一时刻,这两个层次结构必须相关联。例如,A 类与 A1 相关,B 类与 B1 相关......其中 A、B、C 属于层次结构 1,A1、B1、C1 属于层次结构 2。 在 C 代码中,这是通过将层次结构 2 的标记字段(或 switch..case 中使用的类型字段)存储在 A、B、C 中来实现的。有人可以指导我如何干净地实现这个 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++ 中实现这一点?
谢谢, 悟空。
最佳答案
如果您不想在运行时创建对象。您可以使用以下方法。只创建一次对象。 由于您不需要访问类的成员,单个对象将完成您的工作;
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;
}
关于C++ 相关的继承层次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796328/