Как правильно вызвать конструктор копирования при использовании rvalue для объекта? - PullRequest
1 голос
/ 17 января 2020

Здесь я пытаюсь поместить sh объект в вектор, используя функцию push_back и значение этого объекта. Посмотрите на функцию addMovie() класса Movies ниже

#include "Movies.h"

void Movies::addMovie(std::string name, std::string rating, int watched)
{

    movieColl.push_back(Movie{name,rating,watched});           //apparently I am having problem here

}

Остальные необходимые детали здесь

class Movies
{
    public:
        void addMovie(std::string name, std::string rating, int watched);

    protected:

    private:
        std::vector <Movie> movieColl;

};

Mov ie сам класс ... У меня есть я только что показал конструкторы, хотя я реализовал другие функции

class Movie
{
    public:
        Movie(std::string name,std::string rating, int watched = 0);
        Movie(const Movie &obj);

        Movie();

        void getMovieDetails();
        void addToWatchTime(int num = 1);
        void setMovieDetails(std::string name,std::string rating, int watched = 0);

    protected:

    private:
        std::string name;
        std::string rating;
        int watched;
};

Movie::Movie(std::string name,std::string rating, int watched):name{name},rating{rating},watched{watched}
{
    //ctor

}

Movie::Movie(const Movie &obj):Movie(obj.name,obj.rating,obj.watched){}

Movie::Movie():Movie("None","NA",0){} 

Моя ОСНОВНАЯ функция

#include<iostream>

#include"Movies.h"

using namespace std;

int main()
{


    Movies collection;

    collection.addMovie("GG","PG",343);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Используйте emplace_back и std :: move.

movieColl.emplace_back(std::move(Movie{name,rating,watched})); 
0 голосов
/ 17 января 2020

Обычно существует два подхода к решению этой проблемы

Подход 1: Использовать конструктор копирования по умолчанию, предоставляемый компилятором.

Подход 2: Это немного странно. Поэтому вместо ввода

movieColl.push_back(Movie{name,rating,watched}); 

я набрал

movieColl.push_back(Movie(name,rating,watched)); 

В основном я изменил фигурные скобки на нормальные скобки, и это сработало ..

...