2010-04-14 83 views
1

我有一個叫電影與下面的私有數據成員類:類的C++ Vector對象

private: 
    string  title_ ; 
    string  director_ ; 
    Movie_Rating rating_ ; 
    unsigned int year_ ; 
    string  url_ ; 
    vector<string> actor_; 

它還包含以下拷貝構造函數:

Movie::Movie(Movie& myMovie) 
{ 
    title_ = myMovie.title_; 
    director_ = myMovie.director_; 
    rating_ = myMovie.rating_; 
    year_ = myMovie.year_; 
    url_ = myMovie.url_; 
    actor_ = myMovie.actor_; 
} 

當我嘗試創建一個矢量這個類的,

vector<Movie> myMovies; 

,然後接受所有來自用戶的信息到一個臨時Movie對象(myMovie1),然後用推回:

myMovies.push_back(myMovie1); 

我得到以下錯誤:

1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector(1233) : error C2558: class 'Movie' : no copy constructor available or copy constructor is declared 'explicit' 

我要去哪裏錯了?它似乎想要一個複製構造函數,但我確實有一個定義。

+0

慣用的拷貝構造函數的簽名是'電影::電影(const的電影及爲myMovie)'...你最好放一個 「S」 爲'actor_',有其中幾個...你最好離開編譯器自動生成複製構造函數,因爲那裏沒有任何特殊的邏輯。 – 2010-04-14 18:21:04

回答

4

我的猜測是它抗議將臨時綁定到非const引用。嘗試Movie::Movie(const Movie & myMovie)作爲你的拷貝構造函數的簽名。

+0

謝謝。這工作。 – xbonez 2010-04-14 18:00:56

0

進入vector的元素必須符合「可複製構造」的要求;也就是說,他們必須有一個可用的拷貝構造函數。現在,你的拷貝構造函數是私有的還是受保護的?

在C++ 11中,vector也可以採用可移動的對象,但如果要複製vector,它們仍需要可複製。

+0

該標準允許複製構造函數採用const或非const引用,儘管前者在實踐中更爲常見。採用非const引用的函數不能將臨時對象或常量對象作爲參數。 – 2010-04-14 17:57:00

+0

是的,我意識到發佈後,所以我編輯。 – 2010-04-14 17:57:49

0

更改拷貝構造函數來

Movie::Movie(Movie const& myMovie) 

或者完全刪除 - 這似乎是默認(淺拷貝),在這種情況下確定。

+0

這裏不會很淺(沒有指針/參考) – 2010-04-14 18:21:44

+0

是的,我錯過了有幾個成員是對象的觀點。當然,默認的構造函數執行深度複製並尊重對象語義。 – a1ex07 2010-04-14 18:49:10

+0

它使會員智能複製,其中的成員自動照顧深層複製。用戶定義的構造函數在這裏不是必需的。 – UncleBens 2010-04-14 19:04:10

0

你拷貝構造函數必須是這樣的:

Movie::Movie(const Movie& myMovie) 

const需要編譯器找到它。

1

代碼應爲:

Movie::Movie(const Movie& myMovie) 
{ 
title_ = myMovie.title_; 
director_ = myMovie.director_; 
rating_ = myMovie.rating_; 
year_ = myMovie.year_; 
url_ = myMovie.url_; 
actor_ = myMovie.actor_; 
}