c ++在类之间传递对象

时间:2016-11-20 14:16:22

标签: c++ class error-handling constructor

我正在学习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;
    }

2 个答案:

答案 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。然后你可以像现在一样使用它。