2010-04-14 3 views
1

У меня есть класс под названием Movie со следующими частными членами данных:C++ вектор объектов класса

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

идиоматических конструктор копирования подписи 'Movie :: Movie (Const Movie & myMovie)' ... вы бы лучше поставить "S" в 'actor_', есть некоторые из них ... вам лучше оставить компилятор автоматически сгенерировать конструктор копирования, поскольку там нет никакой специальной логики. –

ответ

4

Моя догадка заключается в том, что она протестует против привязки временной к неконстантной ссылке. Попробуйте Movie::Movie(const Movie & myMovie) как подпись для вашего конструктора копий.

+0

Спасибо. это сработало. – xbonez

0

Элементы, которые входят в vector, должны соответствовать требованию «копировать»; то есть они должны иметь конструктор копирования. Теперь, ваш конструктор копирования закрыт или защищен?

В C++ 11, vector также может принимать объекты, которые могут перемещаться, хотя их все еще необходимо скопировать, если вы хотите скопировать vector.

+0

Стандарт позволяет конструкторам копировать либо использовать константы, либо неконстантные ссылки, хотя первая на практике гораздо более распространена. Функция, которая принимает ссылку не const, не может принимать временные или const-объекты в качестве аргументов. –

+0

Да, я понял, что после публикации, так что я отредактировал. –

0

Изменить конструктор копирования для

Movie::Movie(Movie const& myMovie) 

или удалить его полностью - это, кажется, что по умолчанию (поверхностное копирование) нормально в данном случае.

+0

Это не было бы мелким здесь (без указателя/ссылки) –

+0

Да, я пропустил мысль о том, что есть несколько членов, которые являются объектами. Разумеется, конструктор по умолчанию выполняет глубокую копию и уважает семантику объекта. – a1ex07

+0

Он делает копию пользователя, где участники автоматически заботятся о глубоком копировании. Определенный пользователем конструктор здесь не нужен. – UncleBens

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_; 
} 
Смежные вопросы