2017-09-16 39 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:如果您在發佈後不久編輯答案,您將遇到與海報發生編輯衝突,就像發生在這裏的事情。 –