C++:为指向两种类型之一的指针保留打开选项
C++: Leaving open option for a pointer to point to one of two types
在C++中,我有两个类:Node
和RootNode
。我想要一个Node
的成员,它可以是指向Node
或RootNode
的指针。有没有什么方法可以让指针指向两个不同类中的一个,而不需要提交其中一个,直到我设置了指针的值?
我用union
看到了一些答案;我不确定这些是否有效,因为要使用使用union
定义的变量,我必须知道它是指向Node
还是指向RootNode
,这样我才能知道要引用union
的哪个对象(union_typedef.node
还是union_typedef.rootnode
)。我希望能够使用这个指针,而不需要知道它指向的是Node
还是RootNode
。
有一种方法可以做你想做的事情,也有一种方式可以做你可能需要做的事情(这两者是不同的)。
要执行您想要的操作(设置两种类型之一的指针),请使用union
:
struct MyStruct {
union {
Node *nodePtr;
RootNode *rootPtr;
}
};
在上面,您可以设置nodePtr
或rootPtr
,但并集将占用单个指针的空间。
然而,您可能需要的是一个具有虚拟函数的类继承,以及一个指向基类的指针:
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
的指针,并为其指定一个指向Node
或RootNode
的指针。无论您分配什么,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;
Node
和RootNode
都不是从另一个派生的。
如果派生层次结构是固定的,并且您不能更改它,那么您可以为Node
和RootNode
构建包装器类,让一个包装器从另一个派生(或者让它们都从一个共同的祖先派生),并生成分派到被包装对象的函数的虚拟函数。
当然。使用工会!
union { Node *nodePtr; RootNode *rootNodePtr; } unionNodePtr;
RootNode
是否派生自Node
,反之亦然?
如果是,那么只需将您的成员声明为哪种类型是"基"类型。例如:
class Node
{
public:
Node *member;
};
class RootNode : public Node
{
};
如果没有,您将不得不使用union
:
class RootNode
{
};
class Node
{
public:
union {
RootNode *root;
Node *node;
} member;
};
- 指针保留字符串
- 保留函数指针模板参数
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 保留计时器集合(对象与指针)的最佳方法
- 更改保留指向其字段的原始指针的对象地址
- 释放指向保留嵌套变量内存地址的结构的指针
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 如何在字符指针数组中保留指向每个单词的指针?
- 指向结构的指针保留某些属性,同时将其他属性重置为零(使用 map)
- 即使阵列腐烂到指针,如何将函数的参数保留为数组,这很好
- clock_nanosleep - 请求和保留的相同指针
- 如何在不覆盖C 中保留指针的价值
- 无法保留指向内存的指针
- 结构中的C++数组指针保留内存位置,但丢失所有值
- 删除动态数组,但保留指针
- 如何在参数中传递双重指针,以保留值
- C++:为指向两种类型之一的指针保留打开选项
- 返回类型,或如何保留对象指针的类型
- 保留存储在STL容器中的指针所指向的值(unordered_map)
- 非NULL保留指针值