2014-12-05 111 views
0

我目前正在創建一個必須從std :: vector派生的類。我意識到它可能不好做,但我需要。現在我的問題是你如何訪問成員函數中創建的向量,基本上使類訪問自己像一個整數的常規向量?例如,我正在查找myVector.at(0)的等效項,以返回向量中的第一項。另外,向量的大小應始終6.這​​是我的代碼至今:繼承std :: vector

class aHistogram : public vector<int> 
{ 
public: 
    aHistogram(); //default constructor for histogram class 
    void update(int face); //Function to update histogram 
    void display(int maxLengthOfLine); //Displays histogram to the scale of maxLengthOfLine using x's 
    void clear();//Function to clear histogram bin counts 
    int count(int face) const; // Function to return number of times a face has appeared 
private: 
    int numx, m, j; //Variables used in functions 
}; 

#endif 

需要的類來訪問本身的功能是下面,我知道有沒有所謂的「myVector」矢量但我失去的是能夠執行操作的等效語法。

void aHistogram::clear() 
{ 
    //Clears bin counts to 0 
    myVector.at(0) = 0; 
    myVector.at(1) = 0; 
    myVector.at(2) = 0; 
    myVector.at(3) = 0; 
    myVector.at(4) = 0; 
    myVector.at(5) = 0; 
} 
+0

您可以在子類中做這樣的功能私有成員實現這一目標。這個問題解決了從標準庫類型繼承的優點/缺點,以及哪些類型被設計爲從繼承。這裏的OP是問一個簡單的語法問題。 – Praetorian 2014-12-05 15:43:05

+0

使用'vector'的成員函數就好像它們是由你的類定義的一樣。如果您的類定義了'vector'接口中已存在的成員函數,例如'clear()',則只需明確限定調用。在這種情況下,你可以使用'vector :: clear();'。例如:http://coliru.stacked-crooked.com/a/d3cec10a471438eb – Praetorian 2014-12-05 15:48:35

+0

@Praetorian非常感謝!正是我所需要的。 – Antoninus 2014-12-05 15:54:52

回答

2

如果有問題的功能沒有在派生類中重寫,您可以 只叫它:

void HistoGram::clear() 
{ 
    at(0) = 0; 
    // ... 
} 

這也是運營商如此,但你必須使用(*this)作爲 左手操作:

void HistoGram::clear() 
{ 
    (*this)[0] = 0; 
    // ... 
} 

如果函數或運算符重載,你要麼必須 限定函數名,

void HistoGram::clear() 
{ 
    std::vector<int>::at(0) = 0; 
    // ... 
} 

或this指針強制轉換爲基類:

void HistoGram::clear() 
{ 
    (*static_cast<std::vector<int>*>(this))[0] = 0; 
    // ... 
} 

但你確定你想在這裏公有繼承?你聲明 向量的大小應該總是6.你沒有辦法保證使用公有繼承;至少,您需要私有 繼承,然後using聲明您需要支持的操作。 (我有一些情況下,我需要限制 std::vector這樣,我已經實現了使用私有 繼承。有時轉發功能,例如 我只想公開const版本的功能)。

另外:有非常非常少的情況,其中std::vector<>::at是 合適。你確定你不想要[],你可以在大多數現代實現中檢查 。

+0

謝謝!我絕對想要私人。 – Antoninus 2014-12-06 16:47:14

0

代替從std::vector推導,在這種情況下含有一種(作爲數據成員)。

導出的問題是可以將Histogram實例視爲std::vector,這樣做會使添加數據成員值的假設無效。

在更多的技術術語,用類派生你有沒有保證級別不變通過std::vector提供一個以上。

根據經驗,一般情況下,類繼承想起以前的數據成員的。

有時繼承是事情,即使是從標準庫的容器類繼承(例如,std::stack是爲繼承而設計的),但在這種情況下不適用。

0

關於此內容:載體的大小應始終爲6

您可能想禁止該類的用戶使用某些功能。例如

  • 矢量::的push_back
  • 矢量:: pop_back
  • 矢量::插入

是可以改變矢量的大小的功能。 @πάνταῥεῖ那是不是這個問題的一個副本

class aHistogram : public vector<int> 
{ 
public: 
    aHistogram(){}; 

private: 

    vector<int>::push_back; 
    vector<int>::pop_back; 
    vector<int>::insert; 

    int numx, m, j; 
}; 
+0

雖然將某些功能私有化並不是未來的證明,但是如果在未來的標準或實現中添加更多可變功能會怎樣?更安全地私下繼承並允許明確的內容。 – sjdowling 2014-12-05 16:22:40

+0

如果「aHistogram」綁定到對「vector 」的引用,則「vector 」的所有功能都可以直接使用。即這不是一個好的解決方案。通常,派生類可以有意義地開放對事物的訪問,但它不能有意義地限制訪問。 – 2014-12-05 23:21:57