为啥我的电影类在创建电影实例时遇到问题?

Posted

技术标签:

【中文标题】为啥我的电影类在创建电影实例时遇到问题?【英文标题】:Why is my class Movie having an issue creating an instance of a Movie?为什么我的电影类在创建电影实例时遇到问题? 【发布时间】:2020-05-11 23:47:02 【问题描述】:

我正在尝试创建 Movie 类的实例,以便我可以将其添加到电影列表中,并与电影播放时间列表配对。但是,无论出于何种原因,它都在说尝试制作电影实例时出错。我认为构造函数可能存在错误,因为我的教授希望我们让Date releaseDate 保持不变,但我无法让一切正常工作。

这里是错误信息

初始化器值太多 “const char”类型的值不能用于初始化电影类型的实体 * 初始化:无法从“初始化列表”转换为“电影 *”

这是我试图用来创建Movie 实例然后将其添加到cinema 中的电影列表的代码:

Movie * movie ("Superman", 1988, 11, 08);
cinema.addMovie(movie, time1);

这是Movie 类:

class Movie 

    public:
        Movie(string & name, int yyyy, int mm, int dd) : name(name), releaseDate(Date(yyyy, mm, dd)) ; 
        const Date & getReleaseDate(); 
        // other? 
        bool operator < (Movie& r);
        bool operator == (Movie &); 
        Movie & operator ++ (); 
        friend ostream & operator << (ostream &, Movie &); 
        friend ostream & operator << (ostream &, const Movie &); 

    private: 
        Movie() = default; 
        const Date releaseDate; 
        string name; 
        int rating;
;

这里是Date 类,它位于Movie 类中,在构造函数中需要:

class Date 

    public: 
        Date(int = 0, int = 0, int = 0);
        //…. 
        // other as appropriate 
        bool operator < (Date&);
        bool operator == (Date &); 
        friend ostream & operator <<(ostream &, const Date &); 

    private:
        int day, month, year;
;

还有Cinema 类,我最终希望通过添加类将其放入:

class Cinema

    public: 
        Cinema() = default; 
        Cinema(Cinema &); 
        void addMovie(Movie *, list<int> & );
        friend ostream & operator << (ostream &, Cinema &); 
        //Movie * operator[](int); 
        void movieRunningAt(Movie &, list<int> & ); 
        void printShowTimes(const Movie *);
        void printAll() const;

    private:
        std::list<Movie *> movies;
        map<const Movie*, list<int>> movie_times;
;

addMovie() 中的Cinema 函数:

void Cinema::addMovie(Movie * m, list<int> & li)

    movie_times.insert(make_pair(m, li));

【问题讨论】:

为什么Cinema 有一个list 和一个包含Movie* 指针的map?你不需要list 当然,按照教授的要求去做,但请注意,const 非静态数据成员通常是个坏主意;他们无条件地禁用分配(可以在需要时通过使整个对象变为常量来禁用)。 【参考方案1】:
Movie * movie ("Superman", 1988, 11, 08);

在上述行中,您声明的是指向电影的指针 (Movie *),而不是 Movie 对象本身。指针不接受构造函数参数。

也许您打算这样做:

Movie * movie = new Movie("Superman", 1988, 11, 08);

【讨论】:

确实有帮助,谢谢,但现在是说,"Severity Code Description Project File Line Suppression State Error C2664 'Movie::Movie(Movie &amp;&amp;)': cannot convert argument 1 from 'const char [9]' to 'std::string &amp;' why does it say it is a char array when there are double quotes around superman? " 一个 字符串文字 是一个 const char[N] 数组,其中 N 是字符串的长度 +1 用于空终止符(所以 "Superman" = 8 个字符 + 1 个终止符 = 9)。 Movie 构造函数通过 non-const 引用获取 string 参数,因此它要求调用者提供实际的 string 对象,编译器不能隐式const char[] 转换为 temp string 对象以满足该引用。更改参数以通过 按值 (Movie(string name, ...)) 或通过 const 引用 (Movie(const string &amp; name, ...)) 传递 string,然后是 隐式 转换将起作用。【参考方案2】:

对象的初始化存在问题。您已经使用了指针,但尚未对其进行初始化。您可以声明对象,对其进行初始化,然后使用指针。希望对您有所帮助。

【讨论】:

以上是关于为啥我的电影类在创建电影实例时遇到问题?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在 MPMoviePlayer 中播放一部电影而不能播放另一部电影?

为啥我的电影不能使用 MPMoviePlayerController 播放?

使用 AVAsset 制作带有图片数组和歌曲文件的电影文件

MPMoviePlayerController 随机不播放电影

如何获取动态创建的电影剪辑或名称的实例名称?

(MySQL) 使用 DATEDIFF 函数时遇到问题