2015-12-06 100 views
1

所以我正在用C++編寫一個程序,而且我的主要方法必須構造一個將矢量作爲參數的對象。C++在構造函數中通過引用傳遞

這是我的代碼:

int main() { 
    vector<Seller> *staff = new vector<Seller>; 

    for (int i = 0; i < 50; i++) { 
    staff->push_back(Seller(i)); 
    } 

    BookStore store(*staff); 

    deque<Book> books; 
    books = store.getBooks(); 
} 

所以,這些都是一些非常簡單的面向對象的概念,我認爲。

我的目標是:

首先,初始化賣方的空向量。賣方是一個具有構造函數的對象:

Seller(int i); 

並且代表當然是賣方。

然後,我想用實際的賣家填寫向量。這些是在for循環中構造的。

然後,我想創建一個商店,它以在那裏工作的賣家作爲參數。

最後,我創建了一個名爲books的新雙端隊列,併爲它分配了Store類中書籍的值。圖書雙端隊列的初始化是在商店的構造函數中完成:

Store::Store(vector<Seller> &sellers) { 
    this->sellers = sellers; 
    this->books = deque<Book> (100, "Harry Potter"); 
} 

所以這是代碼,我想知道如果我在傳遞參數給新構造部分犯了一個錯誤。

通過引用傳遞時我有點困惑,所以我要求在那部分幫助一下。我有兩個主要問題:

1)那裏有任何錯誤,考慮我想如何運行我的程序?還要考慮在主要方法的其餘部分(這裏不包括),我經常改變書籍deque的價值。 2)有沒有什麼方法可以替換deque中的元素而不必擦除和插入?

是否有內置函數替換?如果不是,下面的代碼將工作,如果我只想替換deque中的值?

例如,如果雙端隊列是這樣的:

3 4 5 2 

它(迭代器)擁有價值2

然後我想雙端隊列成爲:

3 4 6 2 

當做:

books.erase(it); 
books.insert(it, 6); 

感謝您的任何提示或幫助!

回答

0

好的,這裏有一個簡短的分析。

首先,我發現的唯一真實錯誤:staff被定義爲一個指針,並給出一個值爲new,但從未釋放。你無論如何都應該避免使用生指針,所以無論是在棧上創建對象:

vector<Seller> staff{}; 

,或者使用智能指針

auto staff = make_unique<vector<Seller>>{}; 

(那麼你將有機會學習一些關於所有權的語義,因爲你仍然是初學者,我會推薦第一個解決方案)。

然後,請注意在Store::Store

this->sellers = sellers;

將使sellers向量,這可能不是你的意思的副本。如果你想你的店引用上main()創建的變量,你應該重新定義你的Store作爲

class Store { 
    // ... 
    vector<Seller>& sellers; 
    //... 
}; 

和構造函數

Store::Store(vector<Seller> &sellers) : 
    sellers{sellers} // reference member variables must be given a value before the body of the constructor begins 
{ 
    books = deque<Book> (100, "Harry Potter"); 
} 

出於同樣的原因,你的行

books = store.getBooks(); 

將製作deque的副本(但在這種情況下可能是有意的)。

最後,C++在<algorithms>庫下提供了許多容器操作函數。看看the reference。但是,如果您已經有要替換的元素的迭代器,則不需要此類算法,只需編寫:

*it = 6;