C++ C++;构造函数的使用和错误?

C++ C++;构造函数的使用和错误?,c++,constructor,C++,Constructor,我有这个构造函数 Movie::Movie(char *&t, char *&d) { title = t; director = d; } 我的主要观点是: Movie * movies = new Movie[movie_size];//creating array of class "Movie" Movie *movieone=new Movie("MovieTitle", "Director"); m

我有这个构造函数

  Movie::Movie(char *&t, char *&d)
    {
       title = t;
       director = d;
    }
我的主要观点是:

   Movie * movies = new Movie[movie_size];//creating array of class "Movie" 
   Movie *movieone=new Movie("MovieTitle", "Director");
   movies[0]=movieone;
我得到以下错误: 没有用于初始化'Movie'main.cpp第14行的匹配构造函数C/C++问题


这不是正确的吗,我错过了什么吗?谢谢

考虑在课堂上使用std::string存储字符串。对于参数pass,最好使用conststring&或constchar*

考虑使用std::string在类中存储字符串。对于参数pass,最好在执行此操作时使用const string&或const char*

Movie("MovieTitle", "Director");
您正在传递字符串文字,这些文字折叠为
const char*
。但是您的构造函数对
char*
进行非常量引用:

Movie::Movie(char *&t, char *&d) { .... }
不能将非常量引用绑定到
const
的对象。但实际上,看起来你根本不需要参考资料。只需按值获取指针,但要使它们指向某个常量:

Movie::Movie(const char* t, const char* d)
这要求您将
标题
控制器
更改为
常量字符*
,如果您想让它们指向字符串文本,这是有意义的

但是请注意,该设计依赖于调用方传递字符串文本,或者传递指向比给定的
电影
实例寿命更长的对象的指针。这是可以工作的,但相当脆弱。更安全的选择是让
电影
拥有数据,这可以通过给它
std::string
成员变量来轻松实现

Movie("MovieTitle", "Director");
Movie *movieone=new Movie("MovieTitle", "Director");
您正在传递字符串文字,这些文字折叠为
const char*
。但是您的构造函数对
char*
进行非常量引用:

Movie::Movie(char *&t, char *&d) { .... }
不能将非常量引用绑定到
const
的对象。但实际上,看起来你根本不需要参考资料。只需按值获取指针,但要使它们指向某个常量:

Movie::Movie(const char* t, const char* d)
这要求您将
标题
控制器
更改为
常量字符*
,如果您想让它们指向字符串文本,这是有意义的

但是请注意,该设计依赖于调用方传递字符串文本,或者传递指向比给定的
电影
实例寿命更长的对象的指针。这是可以工作的,但相当脆弱。更安全的选择是
Movie
拥有数据,这可以通过给它
std::string
成员变量来轻松实现

Movie *movieone=new Movie("MovieTitle", "Director");
这里您传递的是
const char*
,但是您的构造函数需要
char*
,因此它不匹配。考虑将构造函数更改为字符串或conchch**/p>
这里您传递的是
const char*
,但是您的构造函数需要
char*
,因此它不匹配。考虑将构造函数更改为字符串或conchch**/p>如JuangophanZa所指出的,问题是字符串文字被转换为类型<代码> const char */COD>,但是构造函数只引用(非const)代码> char */COD>,所以不匹配。 第二点是

Movie * movies = new Movie[movie_size];//creating array of class "Movie" 
Movie *movieone=new Movie("MovieTitle", "Director");
movies[0]=movieone;
不行。第一行创建一个
电影
数组(或者尝试——除非您有默认构造函数,否则它不会工作),但第三行尝试将第一个条目设置为
电影*
。相反,您需要a)创建
movies
作为一个数组,其中包含指向
Movie
s的指针,或者b)复制
movieone
,方法是

movies[0] = *movieone;
无论哪种方式,您都需要非常小心使用这种方法的对象生命周期;一方面泄漏内存,另一方面保留对不存在对象的引用,这将非常容易

更好的方法是根本不(直接)使用任何动态内存分配。您可以使用标准的库设施来隐藏所有内容,如下所示:

class Movie
{
public:
    Movie(const std::string& title, const std::string& director)
        : _title(title), _director(director) {}

private:
    std::string _title;
    std::string _director;
};

// later...
std::vector<Movie> movies;
movies.push_back(Movie("Jurassic Park", "Steven Speilberg"));
类电影
{
公众:
电影(const std::string和title,const std::string和director)
:(职务),(主任){}
私人:
std::string _title;
std::string\u控制器;
};
//后来。。。
矢量电影;
电影。推回(电影《侏罗纪公园》、《史蒂文·斯皮尔伯格》);

这比您上面的方法更安全、更易于使用,而且效率也不亚于您的方法。

正如juanchopanza所指出的,问题是字符串文字被转换为类型
常量字符*
,但您的构造函数只引用(非常量)
字符*
,因此它不匹配

第二点是

Movie * movies = new Movie[movie_size];//creating array of class "Movie" 
Movie *movieone=new Movie("MovieTitle", "Director");
movies[0]=movieone;
不行。第一行创建一个
电影
数组(或者尝试——除非您有默认构造函数,否则它不会工作),但第三行尝试将第一个条目设置为
电影*
。相反,您需要a)创建
movies
作为一个数组,其中包含指向
Movie
s的指针,或者b)复制
movieone
,方法是

movies[0] = *movieone;
无论哪种方式,您都需要非常小心使用这种方法的对象生命周期;一方面泄漏内存,另一方面保留对不存在对象的引用,这将非常容易

更好的方法是根本不(直接)使用任何动态内存分配。您可以使用标准的库设施来隐藏所有内容,如下所示:

class Movie
{
public:
    Movie(const std::string& title, const std::string& director)
        : _title(title), _director(director) {}

private:
    std::string _title;
    std::string _director;
};

// later...
std::vector<Movie> movies;
movies.push_back(Movie("Jurassic Park", "Steven Speilberg"));
类电影
{
公众:
电影(const std::string和title,const std::string和director)
:(职务),(主任){}
私人:
std::string _title;
std::string\u控制器;
};
//后来。。。
矢量电影;
电影。推回(电影《侏罗纪公园》、《史蒂文·斯皮尔伯格》);

这比上面的方法更安全、更容易使用,而且效率不低于您的方法。

是否有任何理由使用
char*
而不是
std::string
?是否有任何理由使用
char*
而不是
std::string
?BenjaminLindley说得太对了。我在上面加了一句话。@BenjaminLindley说得太对了。我在上面加了一句话。