Tree
のすべての機能(つまり、appendChild
、childCount
)を含むC++ Template
クラスを設計しようとしています。このテンプレートクラスからextend
にして、既存の機能を持つカスタムTreeクラス(Methods
)と追加機能を設計したいと思います。C++テンプレートクラスの継承の理解
これまでのところ私はこれを得ました。私は(つまりコンストラクタoverload
)派生クラスでいくつかの新しいコンストラクタを追加しようとしていない場合
#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;
}
今、すべてが良いです。しかし、(コードセグメントが示すように)新しいコンストラクタを追加する場合、(Base Templateクラスの)既存のコンストラクタにアクセスできません。私はラインTreeItem *child2 = new TreeItem();
に次のエラーを取得しています私はここで愚かな何かをやっていますか?私は他のメソッドをオーバーロードすることができますが、コンストラクタでのみ失敗します。どのように私はベーステンプレートクラスの既存のコンストラクタをオーバーロードできますか?
カスタムコンストラクタがある場合は、 'TreeItem'クラスに' TreeItem(){} 'を置くだけでデフォルトのコンストラクタを実装する必要があります。 – George
ちょっとしたアドバイス - なぜユーザーがあなたの 'TreeTemplate'クラスへのポインタを提供しなければなりませんか?木の中にプレーンな 'int'を格納したいのであれば、保存したいすべての整数に対して' new int'を実行することでメモリリークを起こす必要があるのはなぜですか?良いクラスは値型で動作します - ユーザーが実際にポインタを格納したい場合は、クラスポインタに格納します。たとえば、 'std :: vector'と 'std :: vector 'を比較します。 Widgetへのポインタを格納したい場合は、後者を宣言します。 –
PaulMcKenzie
@George、派生クラスに新しいコンストラクタが宣言されるとすぐに、ベースクラスのコンストラクタにアクセスできなくなりますか? –