2016-11-20 6 views
0

Я изучаю классы C++, и в моем курсе мне нужно создать книжный магазин, в котором есть классы «книга», «автор» и «магазин».C++ передача объектов между классами

Я не совсем уверен, как взаимодействовать между классами, когда дело доходит до извлечения имени автора в классе Book.

Когда я запускаю ниже фрагмент кода в Xcode Я уведомлен о следующей ошибке на классе œuvre в застройщик: ожидаемый „(“ или „{“

UDPATE 22-ноября-2016 I обновили код с тем, что я сделал до сих пор.

Во-первых, у меня есть проблема, когда я пытаюсь отобразить имя автора из класса Book_copy. Я просто не знаю, как это сделать.

I Я поставил author.getName() только сейчас, но я знаю, что это не сработает.

Вторая проблема связана с ошибками, которые возникают при отключении Author copy constructors и конструктора Book. ???

Третья проблема, если предположить, что указанные выше исправлены, она не будет полностью следовать инструкциям, которые я получил для создания этой программы.

Класс Книга должна быть охарактеризована:. Заголовка строки, постоянной ссылкой на автора и другую строку для языка она была написана в

Вот где я был ввернут в первую очередь пытается использовать константная ссылка на автора ...

#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; 
} 

есть, вероятно, некоторые понятия, я не до конца понимал, и именно поэтому я создаю эти вопросы.

Пожалуйста, просветите меня.

UPDATE 29-Nov-2016

Nobody? Я иду сюда. Каждый раз, когда я получаю что-то, чтобы работать, что-то еще больше работает ... :( Код ниже почти работает, за исключением того, что кажется, что вектор 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; 
    } 
+3

Вы ошибочно написали имя конструктора автора. –

+0

имя конструктора должно совпадать с именем класса. Также один объект содержит ссылку на другой объект, это больше вопрос дизайна ... вид композиции против агрегации. – basav

+0

Спасибо. Классы, атрибуты, конструктор и т. Д. Были на другом языке, я перевел их, чтобы дать немного контекста. Я забыл об этом. –

ответ

1

Этот код не компиляция, потому что вы не инициализировать личное ссылочного элемента в класс Author. Исправьте список инициализации.

Book(string title, const Author &author, string language) 
    : title(title), author(author), language(language) {} 
+0

Я пробовал этот путь, но это приносит еще одну проблему, когда я пытаюсь вывести содержимое на терминал. ** ror: pass 'const Author' as 'this' аргумент 'const string Автор :: getName()' отбрасывает квалификаторы ** _ Следующим является метод, который мне нужен в классе Book: _ ' void display () const {cout << title << "," << Author.getName() << ", en" << язык << endl; } ' –

0

с класс книги, имеющий Author &author частный, необязательно требуется, поскольку манипуляция переменной ограничена тем, что она является частной. Для ошибки, в которой вы звоните author.getName() Я уверен, что это ошибка, так как вы называете это инициализацией ctor, где вы устанавливаете переменные в своем классе, и поскольку переменная в этой позиции является указателем, и вы вызываете getName(), который возвращает строку std :: есть несоответствие. Я думаю, вы также получите сообщение об ошибке, поскольку вы делаете const Author &author точкой в ​​пространстве в памяти, но на самом деле вы не говорите, где указать.Это должно быть что-то вроде const Author &author = nullptr;

Замечание: Из того, что я вижу, вы используете using namespace std. НИКАКАЯ ТОЧКА НЕ ДОЛЖНА БЫТЬ ЭТО. когда вы используете эту линию, вы открываете себе массу ошибок и головных болей. Если по какой-то причине вы хотите сделать это проще, вы можете написать строку using std::string в верхней части заголовка или исходного файла. Затем вы можете использовать его так же, как вы его используете сейчас.

+0

Я сменил конструктор на 'Book (название строки, const Author & author, string language) : название (название), автор (автор), язык (язык) {}' в классе книги, но теперь мне также нужно следующий способ вывода содержимого на терминал. 'void display() const {cout << title <<", "<< Автор.getName() <<", ru "<< язык << endl; } 'Это создает другое сообщение об ошибке _error: передача 'const Auteur' как 'this' аргумент 'const string Auteur :: getNom()' discards qualifiers_ –

+0

Я думаю, что это может иметь отношение к вашему' getName() '. действительно нет причин для того, чтобы быть постоянным, поскольку вы не возвращаете ссылку или указатель. Если это не проблема, это может быть 'const' на дисплее, как снова, что на самом деле не нужно. Если по какой-то причине ни одна из этих проблем не является проблемой, я бы избавился от константы в переменной 'author', поскольку она не нужна/на самом деле не является постоянной. также вам нужно вызвать метод на дисплее как 'author.getName()', но я предполагаю, что это ошибка перевода. – matt2405

Смежные вопросы