我正在学习c ++课程,在我的课程中,我需要创建一个书店,其中包含" book"," author"和" Store"类。
我不太确定在类中提取作者姓名时如何在类之间进行交互。
当我在Xcode中运行下面的代码时,我会在Oeuvre的课程中收到以下错误的通知。 contructor:预期'('或' {'
UDPATE 2016年11月22日 我已经用我到目前为止所做的更新了代码。
首先,当我尝试显示Book_copy类中的作者姓名时,我遇到了问题。我根本不知道该怎么做。
我暂时放了author.getName(),但我知道它不会工作。
第二个问题是禁用Author copy构造函数和Book构造函数附带的错误。 ???
第三个问题,假设以上是固定的,它不会完全按照我收到的指令来构建这个程序。
Book类必须具有以下特征:字符串标题,对其作者的常量引用,以及其所写语言的另一个字符串。
我试图使用const引用给作者的第一个地方......
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Author{
private:
string name;
bool award;
public:
Author(string name, bool award=false) : name(name), award(award) {}
const string getName(){ return name; }
const bool getAward() { return award; }
Author(Author const&) = delete;
};
class Book{
private:
string title;
Author &author;
string language;
public:
Book(string title, Author author, string language) : title(title), author(author), language(language) {}
const string getTitle() { return title; }
string getAuthor() { return author.getName(); }
const string getLanguage() { return language; }
void display_book() { cout << title << author.getName() << endl; }
~Book() { cout << title << author.getName() << endl;}
Book(Book const&) = delete;
};
class Book_copy{
private:
Book &book;
public:
Book_copy(Book &nuovo) : book(nuovo) {
cout << book.getTitle() << author.getName() << endl;
}
/*** Copy constructor ***/
// Book_copy(Book_copy const& dupli)
~Book_copy () {
cout << book.getTitle() << author.getName() << endl;
}
const Book &getBook() const { return book; }
void display_book() { cout << book.getTitle() << author.getName() << endl; }
};
class Library{
private:
vector <Book_copy*> bibil;
string name;
public:
Library(string name) : name(name){
cout << name << " is open" << endl;
}
const string &getName() { return name; }
void store(Book_copy const &livre, unsigned int qty = 1) {
for(unsigned int i(0); i < qty; i++){
// This is where I need to store the number of book copy in the library...
}
}
~Library() {
cout << name << " is closing down" << endl;
}
};
int main()
{
Author a1("Victor Hugo"),
a2("Stephen King"),
a3("Raymond Queneau", true);
Book o1("Les Misérables", a1, "french" );
Book o2("Carrie", a2, "english" );
Library biblio("whatever");
biblio.store(o1);
biblio.store(o2, 2);
return 0;
}
可能有一些我尚未完全理解的概念,这也是我创造这些问题的原因。
请赐教。
2016年11月29日更新
没人?我在这里转圈。每当我得到一些工作,其他东西确实有效...... :( 下面的代码几乎可以工作,除了看起来Bibiliotheque矢量是空的。 有太多的线条,有些是完全无用的,我来回尝试不同的东西让它工作......
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Auteur{
private:
string nom;
bool prix;
public:
Auteur(string nom="", bool prix=false)
: nom(nom), prix(prix) {}
string getNom() { return nom; }
bool getPrix() { return prix; }
Auteur(Auteur const&) = delete;
};
class Oeuvre{
private:
string titre;
Auteur &auteur;
string langue;
public:
Oeuvre(string titre, Auteur &auteur, string langue)
: titre(titre), auteur(auteur), langue(langue) {}
const string getTitre() { return titre; }
string getAuteur() const { return auteur.getNom(); }
const Auteur &getAut() const { return auteur; }
string getLangue() { return langue; }
void affiche() const { cout<<"Affiche "<<titre<<auteur.getNom()<<langue << endl; }
~Oeuvre() { cout<<"Destroyed "<<titre<<auteur.getNom()<<langue<< endl; }
Oeuvre(Oeuvre const&) = delete;
};
class Examplaire{
private:
Oeuvre &oeuvre;
public:
Examplaire(Oeuvre &nuovo)
: oeuvre(nuovo){ cout<<"New "<<oeuvre.getTitre()<<oeuvre.getAuteur()<<oeuvre.getLangue() << endl; }
Examplaire(Examplaire const& copie)
: oeuvre(copie.oeuvre){ cout<<"Copy "<<oeuvre.getTitre()<<oeuvre.getAuteur()<<oeuvre.getLangue() << endl; }
const Oeuvre &getOeuvre() const { return oeuvre; }
string getTitre() { return //TODO need to return title
oeuvre.getTitre();
}
string getLangue() { return "";
// oeuvre.getLangue(); // crashes!! TODO need to return language
}
void affiche() { cout<<"Affiche "<< oeuvre.getTitre()<<oeuvre.getAuteur()<<oeuvre.getLangue();
}
};
class Bibliotheque{
private:
vector <Examplaire*> bibil;
string name;
public:
Bibliotheque(string name) : name(name){
cout << "La bibliothèque " << name << " est ouverte !" << endl;
}
const string &getNom() { return name; }
void stocker(Oeuvre & livre, unsigned int qty = 1) {
for(int i(0); i < qty; i++){
Examplaire temp = livre;
bibil.push_back(&temp);
}
}
const void lister_exemplaires(string langue = "none") const {
for(auto & book : bibil){
if((book->getLangue() == langue))
cout << book->getTitre() << endl;
// TODO display books in a chosen language or all if none
}
}
int compter_exemplaires(Oeuvre &livre) const{
int compt = 0;
for(auto * book : bibil){
// TODO display how many copy of livre
if(book->getTitre() == livre.getTitre())
compt++;
}
return compt;
}
void afficher_auteurs(bool prix = false) const{
for(auto * book : bibil){
// TODO display auteur names based on prix true or false
}
}
~Bibliotheque() {
cout << "La bibliothèque " << name << " ferme ses portes,"<< endl;
cout << "et détruit ses exemplaires :" << endl;
}
};
int main()
{
Auteur a1("Victor Hugo"),
a2("Alexandre Dumas"),
a3("Raymond Queneau", true);
Oeuvre o1("Les Misérables " , a1, " français" ),
o2("L'Homme qui rit " , a1, " français" ),
o3("Le Comte de Monte-Cristo " , a2, " français" ),
o4("Zazie dans le métro " , a3, " français" ),
o5("The Count of Monte-Cristo ", a2, " anglais" );
Bibliotheque biblio("public");
biblio.stocker(o1, 2);
biblio.stocker(o2);
biblio.stocker(o3, 3);
biblio.stocker(o4);
biblio.stocker(o5);
cout << "The library contains :"<< endl;
biblio.lister_exemplaires();
cout << "The books is english are :" << endl;
biblio.lister_exemplaires("anglais");
cout << "Award authors are:" << endl;
biblio.afficher_auteurs(true);
cout << biblio.compter_exemplaires(o3)<< " cpoy of Monte christo (should be 3)"<<endl;
cout << "o4 title is " << o4.getTitre()<< "(should be Zazie) :" << endl;
return 0;
}
答案 0 :(得分:1)
此代码未编译,因为您未将私有引用成员初始化为Author类。更正初始化列表。
Book(string title, const Author &author, string language)
: title(title), author(author), language(language) {}
答案 1 :(得分:0)
对于具有Author &author
私有的书类,它不一定是必需的,因为变量的操作受到限制,因为它是私有的。对于你调用author.getName()
的错误,我很确定这是你所谓的错误,它是一个ctor初始化,你可以在你的类中设置变量,因为那个位置的变量是一个指针,你调用getName()
,它返回一个std :: string,这是不匹配的。我认为当你将const Author &author
指向内存空间但你实际上并没有告诉它指向何处时,你也会收到错误。它应该类似于const Author &author = nullptr;
旁注:我可以看到您正在使用using namespace std
。没有任何意义,你应该这样做。当你使用那条线时,你会遇到大量的错误和麻烦。如果由于某种原因您想要更容易,可以在标题或源文件的顶部写下行using std::string
。然后你可以像现在一样使用它。