我想設計一個C++ Template
類,它將包含Tree
(即appendChild
,childCount
)的所有功能。然後,我想從此模板類中獲取extend
,並設計具有現有功能的自定義樹類(讀爲Methods
)以及額外的功能。瞭解C++模板類繼承
到目前爲止,我得到了這個。現在
#include <iostream>
#include <list>
/* TREE TEMPLATE CLASS */
template <class T>
class TreeTemplate
{
public:
TreeTemplate();
void appendChild(T*);
int getChildCount();
protected:
std::list<T*> m_childList;
};
/* Constuctor */
template <class T>
TreeTemplate<T>::TreeTemplate(){}
template <class T>
void TreeTemplate<T>::appendChild(T* t)
{
m_childList.push_back(t);
}
template <class T>
int TreeTemplate<T>::getChildCount()
{
return m_childList.size();
}
/* CLASS INHERITTING TEMPLATE */
class TreeItem : public TreeTemplate<TreeItem>
{
public:
std::string getTestName();
TreeItem(std::string, std::string);
private:
std::string m_testID;
std::string m_testName;
};
TreeItem::TreeItem(std::string test_id, std::string test_name)
{
m_testID = test_id;
m_testName = test_name;
}
std::string TreeItem::getTestName()
{
return m_testName;
}
/* MAIN FUNCTION */
int main()
{
TreeItem *myTree = new TreeItem("9", "10");
TreeItem *child1 = new TreeItem("9.1", "10.1");
TreeItem *child2 = new TreeItem();
std::cout << myTree->getTestName() << std::endl;
myTree->appendChild(child1);
std::cout << myTree->getChildCount() << std::endl;
return 0;
}
,如果我不嘗試添加一些新的構造函數,派生類(即構造器overload
),一切都很好。但是,如果我添加一個新的構造函數(如代碼段所示),我無法訪問(Base Template類的)現有構造函數。我收到以下錯誤在該行TreeItem *child2 = new TreeItem();
我在這裏做一些愚蠢的事?我可以重載其他方法,只在構造函數失敗。我如何重載基模板類的現有構造函數?
你需要實現一個默認的構造函數,如果你有一個自定義的,只是把'TreeItem(){}'在'TreeItem'類。 – George
只是一些建議 - 爲什麼用戶必須提供一個指向你的'TreeTemplate'類的指針?如果我想在樹內存儲一個簡單的'int',爲什麼我需要通過爲所有我想存儲的整數執行'new int'來冒內存泄漏的風險?一個好的類可以處理值類型 - 如果用戶真的想存儲指針,那麼他們會給你的類指針來存儲。例如,比較'std :: vector'和'std :: vector '。如果我想要存儲指向Widget的指針,我聲明後者。 –
PaulMcKenzie
@George,那麼,只要我在派生類中聲明瞭一個新的構造函數,我就無法訪問基類的構造函數? –