gpt4 book ai didi

在构造中定义的 C++ 容器

转载 作者:行者123 更新时间:2023-11-28 05:00:03 24 4
gpt4 key购买 nike

我可能以错误的方式问这个问题,但我想在对象实例化时定义一个成员容器。

namespace GUI {

class MenuNode {
template <typename TMenuItem>
struct MenuItem{
TMenuItem *text;
};
MenuItem<unknown> t;//The member where I want the container
//to be defined upon construction
public:
std::vector<MenuNode*> forward;
MenuNode* parent;
MenuNode();
~MenuNode();
};
}

我可以避免这个问题的一种方法是使 MenuNode 本身成为一个模板类,但是我将拥有带有所需容器的前向和后向指针(链表样式),而且我也不知道它们的容器类型!

namespace GUI {
template<class MenuItem>
class MenuNode {
MenuItem t;
public:
std::vector<MenuNode<unknown>*> forward; //Here I wouldn't know
//what the container will
//even be!
MenuNode<unknown>* parent; //same with this member
MenuNode();
~MenuNode();
};
}

因此,另一种选择是拥有一个指针类型,该指针类型可以指向一个地址,而不管成员的容器是什么

namespace GUI {
template<class MenuItem>
class MenuNode {
MenuItem t;
public:
std::vector<void*> forward;
void* parent;
MenuNode();
~MenuNode();
};
}

但是 void 指针的问题是我不知道如何确定对象持有什么类型的容器!另外,我从未使用过 void 指针!

如果解决方案是在我创建具有非常相似功能(相同名称)的 MenuItem 时使用 void 指针,我可以通过对 void 指针的取消引用来调用它们。

最佳答案

创建一个抽象基类。这是一个草图:

class MenuNodeBase {
std::vector<MenuNodeBase *> forward;
MenuNodeBase *parent;
virtual ~MenuNodeBase() = default;
};

template<class T>
class MenuNode : public MenuNodeBase {
MenuItem<T> t;
};

您可以使用虚函数或dynamic_cast 来访问具体类的功能。

关于在构造中定义的 C++ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259333/

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