我是c ++的新手。我一直在努力克服这个错误。我知道派生类中的一个类,它继承了基类中的所有内容,但是如果派生类有其他数据成员呢?构造函数假设是什么?
当我尝试只放置新的时我尝试将参数传递给构造函数中新创建的类成员,我得到一个错误,说它不匹配基类的类。当我尝试使用基类的那个并添加新的数据成员时,它告诉我我正在重新定义。所以我想知道下面的错误是我的代码。
这是基类:
class movielibrarybase
{
public:
movielibrarybase(string name, string dirname, string gen, int price);
void setname(string name);
string getname();
void setdirector_name(string dirname);
string getdirector_name();
void setgenre(string gen);
string getgenre();
void setprice(int price);
int getprice();
void display();
~movielibrarybase();
protected:
string name;
string director_name;
string genre;
int price;
};
这是派生类:
class songlibrary: public movielibrarybase
{
public:
songlibrary();
void setartist_name(string name);
string getartist_name();
void setsong_position(string position);
string getsong_position;
~songlibrary();
protected:
string artist_name;
string song_postion;
};
我收到以下错误:
songlibrary.cpp ||在构造函数' songlibrary :: songlibrary(std :: string,std :: string,std :: string,int,std :: string,std :: string)' :| songlibrary.cpp | 6 |错误:没有匹配函数来调用' movielibrarybase :: movielibrarybase()' | movielibrarybase.cpp | 3 |注意:候选者是:movielibrarybase :: movielibrarybase(std :: string,std :: string,std :: string,int)| movielibrarybase.h | 8 |注意:movielibrarybase :: movielibrarybase(const movielibrarybase&)| songlibrary.cpp | 34 |错误:没有' std :: string songlibrary :: getsong_position()'在课程' songlibrary' |
中声明的成员函数答案 0 :(得分:4)
对于这种情况,您使用构造函数中的成员初始值设定项列表来调用基类中的正确构造函数:
songlibrary::songlibrary(string name, string dirname, string gen, int price,
string artist_name, string song_position)
: movielibrarybase(name, dirname, gen, price), // initialize base class
artist_name(artist_name), // initialize member in this class
song_position(song_position) {
// other ctor stuff
}
如果未在该列表中声明父类,则默认为默认构造函数。由于movielibrarybase
类中没有默认构造函数,因此发生编译错误。
答案 1 :(得分:1)
在你的情况下,它会是这样的: -
songlibrary::songlibrary( string n, string director, string gen,
int pri, string artist, string song )
: movielibrarybase( n, director, gen, pri ),
artist_name( artist ), song_postion( song )
这里要注意的一件事是成员初始化列表中的序列很重要。第一次调用应该是基类,然后派生类成员应该按照在类中声明它们的顺序进行初始化。
此外,类成员按照它们在类中声明的顺序进行初始化,它们在成员初始化列表中列出的顺序不会产生差别