C 在施工中定义的容器

C++ Container defined in construction

本文关键字:定义 施工中      更新时间:2023-10-16

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

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指针,如果我创建具有非常相似功能的menuitem(同一名称),我可以通过将其调用到void指针。

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

class MenuNodeBase {
    std::vector<MenuNodeBase *> forward;
    MenuNodeBase *parent;
    virtual ~MenuNodeBase() = default;
};
template<class T>
class MenuNode : public MenuNodeBase {
    MenuItem<T> t;
};

您可以使用虚拟功能或dynamic_cast来访问混凝土类的功能。