2017-09-16 61 views
0

我可能会问错误的方式这个问题定义,但我想在对象实例化定义的成员容器。C++集装箱建筑

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(); 
}; 
} 

但随着空指针的问题是我不知道我会怎样确定对象所持有的容器的类型!另外我从来没有使用过空指针!

如果解决方案是,如果我创建具有非常相似的功能(同名)的MenuItems使用空指针我可以给他们打电话,通过取消引用到空指针(S)。

+0

一个替代方案是使用[性病::任何](http://en.cppreference.com/w/cpp/utility/any)如果您使用C++ 17,或'升压:: any'如果你不是。如果您事先知道所有类型,还有'std :: variant'(C++ 17)和'boost :: variant'。 – Jonesinator

回答

1

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

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

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

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

+0

@MooingDuck:如果您在发布后不久编辑答案,您将遇到与海报发生编辑冲突,就像发生在这里的事情。 –