gpt4 book ai didi

C++:为指向两种类型之一的指针保留打开选项

转载 作者:行者123 更新时间:2023-11-30 01:14:28 25 4
gpt4 key购买 nike

在 C++ 中,我有两个类:NodeRootNode。我想要一个 Node 的成员,它可以是指向 NodeRootNode 的指针。有什么方法可以让指针打开指向两个不同类之一的选项,而无需提交其中一个,直到我设置该指针的值?

我看到一些使用 union 的答案;我不确定这些是否有效,因为要使用使用 union 定义的变量,我必须知道它是指向 Node 还是 RootNode 所以我知道要引用哪个 union 对象(union_typedef.nodeunion_typedef.rootnode)。我希望能够使用此指针而无需知道它是指向 Node 还是 RootNode

最佳答案

有一种方法可以做您想做的,也有一种方法可以做您可能需要做的(这两者是不同的)。

做你想做的事(设置两种类型之一的指针)使用union:

struct MyStruct {
union {
Node *nodePtr;
RootNode *rootPtr;
}
};

在上面,您可以设置nodePtrrootPtr,但 union 将占用单个指针的空间。

但是,您可能需要的是具有虚函数的类继承和指向基类的指针:

struct Node {
virtual void doSomething() {
cout << "I'm a node" << endl;
}
};

struct RootNode : public Node {
virtual void doSomething() {
cout << "I'm a root" << endl;
}
};

您可以创建一个指向Node 的指针,并为其分配一个指向NodeRootNode 的指针。无论您分配什么,doSomething() 的调用都将被路由到正确的函数:

Node *n = new Node();
n->doSomething(); // Prints "I'm a node"
delete n;
n = new RootNode();
n->doSomething(); // Prints "I'm a root"
delete n;

Neither Node nor RootNode derive from the other.

如果派生层次是固定的,你不能改变它,你可以为 NodeRootNode 构建包装类,让一个包装器从另一个派生(或让它们两者都派生自一个共同的祖先),并生成分派(dispatch)给包装对象函数的虚函数。

关于C++:为指向两种类型之一的指针保留打开选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30177315/

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