2013-05-30 68 views
1

我遇到了一小部分代碼的問題,我正在嘗試使用模板和模板類的向量
一位朋友幫助我使用以下代碼,使其處於編譯狀態,但我仍然無法使用派生類不夠好,所以我完全失去了,我不能讓過去的這個小錯誤,我真的需要你的幫助模板類的向量?

#include <iostream> 
    #include <vector> 

    class data_base 
    { 
    public: 
     data_base(std::string &_id); 

     std::string id; 
    }; 

    template <typename T> 
    class data : public data_base 
    { 
    public: 
     data<T>(T &_data, std::string &_id); 

     T *data; 
    }; 

    data_base::data_base(std::string &_id) 
    { 
     id = _id; 
    } 

    template <typename T> 
    data<T>::data(T &_data, std::string &_id) 
    { 
     data =& _data; 
     id = _id; 
    } 


    int main() 
    { 
     std::vector< data_base*> stuff; 

     return 0; 
    } 

如何將一個去,周圍用數據並將其放入東西向量,然後訪問它?
哦,如果任何人都會知道使用基礎/派生類的一個很好的教程,我真的可以使用
預先感謝

+2

'data_base'似乎完全沒用,因爲它沒有虛函數。你想重新實現'boost :: any'嗎? –

+0

我正在使用此代碼的一部分,在我的序列化代碼中的舊版本中,我最近決定將其更改爲模板兼容,但我無法使其工作。有沒有辦法完全忽略基類/派生類,只是以任何可能的方式跳到一個模板類矢量? –

回答

2

將如何使用數據類,並把它在東西矢量一個到處去,並在稍後訪問它?

其實很簡單。讓我們通過一些步驟。

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. 

注意MyDataObjectMyVector都分配在棧上,所以當他們超出範圍(其中每個被聲明的方法或塊它們會被破壞 - 一個塊是{...}部 - 結束)。您也可以在堆上分配,並將指針存儲在向量中的基礎對象上。如果你想知道如何做到這一點,請評論 - 我可以擴大答案。

哦,如果有人會知道如何使用基地/派生類的一個很好的教程,我真的可以使用

請詢問每個問題只有一個問題。這有助於保持網站的組織。另外,不像你的第一個問題,我認爲你可以很容易地研究自己。但是,如果您遇到麻煩,請隨時在此提出另一個問題。

但是這裏有一個明顯的錯誤。您的數據(派生類)的代碼具有此構造:

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) 
{ } 

和變化聲明匹配(並且類似地更改基類)嘗試命名事物,以便至少可以區分類型,局部變量和成員變量。