將如何使用數據類,並把它在東西矢量一個到處去,並在稍後訪問它?
其實很簡單。讓我們通過一些步驟。
data<int> MyDataObject(0, "zero");
你或許可以看到類似與你的stuff
聲明:
要創建模板數據類的一個實例,你與你希望它在尖括號使用類型聲明它std::vector< data_base*> stuff;
因爲vector
也是一個模板類。正如你已經知道的,爲了聲明一個類型向量,你需要將該類型放入向量的尖括號中。因此,現在嘗試一下,您知道如何使用特定數據類型聲明您的課程的一個版本:
std::vector<data<int>> MyVector;
您是否看到邏輯?
但是,有一個問題:它不會在大多數C++編譯器上編譯,但這不是因爲您犯了一個邏輯錯誤。這是因爲最後的>>
沒有被識別爲類型聲明的一部分 - 它被認爲是別的東西(>>有另一個含義,我相信這種情況在最新的C++規範中已經修復了)。爲了解決這個問題,強制編譯器通過添加一個空格正確分析:
std::vector<data<int> > MyVector;
空白不正常關係到一個編譯器解析的源代碼,但是在這裏。
現在你有一個使用整數的數據類的向量。
要閱讀使用矢量,我建議this page as a good reference。但是快速瀏覽一下,您使用push_back()
將一個項目追加到向量中,並且可以使用數組索引(即[]
)按索引訪問特定元素,從第一個元素的0開始,並使用size()
來知道有多少元素它包含:
data<int> MyDataObject(0, "zero");
MyVector.push_back(MyDataObject);
data<int> Test = MyVector[0]; // Gets the first item - since only one was added, it should equal MyDataObject.
注意MyDataObject
和MyVector
都分配在棧上,所以當他們超出範圍(其中每個被聲明的方法或塊它們會被破壞 - 一個塊是{...}
部 - 結束)。您也可以在堆上分配,並將指針存儲在向量中的基礎對象上。如果你想知道如何做到這一點,請評論 - 我可以擴大答案。
哦,如果有人會知道如何使用基地/派生類的一個很好的教程,我真的可以使用
請詢問每個問題只有一個問題。這有助於保持網站的組織。另外,不像你的第一個問題,我認爲你可以很容易地研究自己。但是,如果您遇到麻煩,請隨時在此提出另一個問題。
但是這裏有一個明顯的錯誤。您的數據(派生類)的代碼具有此構造:
template <typename T>
data<T>::data(T &_data, std::string &_id)
{
data =& _data;
id = _id;
}
看到它初始化成員變量ID,屬於data_base類。
你應該做的是從你的子構造函數調用祖先構造函數,因爲它應該已經完成初始化id
成員的工作。像這樣:
template <typename T>
data<T>::data(T &_data, std::string &_id) :
data_base(id) // call parent constructor
{
data =& _data;
}
在構造函數中出現的項目是「初始化列表」。事實上,你可以把所有的東西都放在那裏:
template <typename T>
data<T>::data(T &_data, std::string &_id) :
data_base(id), // call parent constructor
data(_data)
{ }
順便說一句,嘗試改變你如何命名的東西。 data
這裏既是你的類的名字,也是一個成員變量。這很混亂。有許多的事物命名,使什麼是什麼更清晰的不同尋常的方式,但一個我個人更喜歡是m_
前綴的成員變量這將導致(M爲成員。):
template <typename T>
data<T>::data(T &data, std::string &id) :
data_base(id), // call parent constructor
m_data(data)
{ }
和變化聲明匹配(並且類似地更改基類)嘗試命名事物,以便至少可以區分類型,局部變量和成員變量。
'data_base'似乎完全沒用,因爲它沒有虛函數。你想重新實現'boost :: any'嗎? –
我正在使用此代碼的一部分,在我的序列化代碼中的舊版本中,我最近決定將其更改爲模板兼容,但我無法使其工作。有沒有辦法完全忽略基類/派生類,只是以任何可能的方式跳到一個模板類矢量? –