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说得太对了。我在上面加了一句话。