2015-07-13 3 views
0

Я читаю книгу на C++ и выписываю код для практики, используя интерфейс и реализацию класса. Я искал решения для своей проблемы на некоторое время безрезультатно.Использование перечисления из класса (C++)

У меня есть класс с перечислением внутри него. При попытке создать экземпляр объекта этого класса у меня возникают проблемы с доступом к типам перечисления вне класса. Я пробовал использовать Book :: Horror, Biblo :: Horror, Biblo :: Book :: Horror, Horror и даже такие вещи, как Biblo :: Book :: Genre :: Horror. Кажется, он не позволяет мне получить доступ к типам перечислений для создания экземпляра моего объекта в файле main.cpp.

Любая помощь приветствуется! Более сложные применения C++ все еще новы для меня. Вот мой источник:

book.h

#include <iostream> 
#include <string> 

using namespace std; 

namespace Biblo{ 

class Book{ 

public: 
    enum Genre{ 
     No_Genre, Horror, Comedy, Romance, Mystery 
    }; 
    // The rest of this header is working fine I think, just this enum 
    class Invalid{}; // Used for throwing errors 

    Book(int n_ISBN, int n_copyrightYear, string n_title, string n_author, Genre n_genre); 
    Book(); 

    // Accessors (non-modifying) 
    int getISBN() const { return ISBN; } 
    int getCopyrightYear() const { return copyrightYear; } 
    string getTitle() const { return title; } 
    string getAuthor() const { return author; } 
    string getGenre() const; 

    // Mutators 
    void changeAuthor(string newAuthor); 
private: 
    int ISBN; 
    int copyrightYear; 
    string title; 
    string author; 
    Genre genre; 

}; // End Book 

// Helper Functions go here 
bool operator==(const Book& a, const Book& b); 
bool operator!=(const Book& a, const Book& b); 
} // End Biblo 

и main.cpp

#include <iostream> 
#include "book.h" 

using namespace std; 

int main() 
{ 
Biblo::Book book(100, 2012, "The Walrus", "The Eggman", Book::Horror); // THIS LINE GIVES ERROR 

cout << "ISBN: " << book.getISBN() << endl; 
cout << "Copyright: " << book.getCopyrightYear() << endl; 
cout << "Title: " << book.getTitle() << endl; 
cout << "Author: " << book.getAuthor() << endl; 
cout << "Genre: " << book.getGenre() << endl; 

return 0; 
} 

Edit: здесь файл book.cpp

#include <iostream> 
#include "book.h" 
#include <string> 

namespace Biblo{ 

Book::Book(int n_ISBN, int n_copyrightYear, string n_title, string n_author, Genre n_genre) 
    :ISBN(n_ISBN), copyrightYear(n_copyrightYear), title(n_title), author(n_author), genre(n_genre) 
{ 
    // constructor 
} 

Book::Book() 
    :ISBN(0), copyrightYear(0), title(""), author(""), genre(Genre::No_Genre) 
{ 
    // Default constructor 
} 

// Accessors 
string Book::getGenre() const 
{ 
    if (Book.genre == Genre::No_Genre) 
     return "No Genre!"; 
    if (Book.genre == Genre::Horror) 
     return "Horror"; 
    if (Book.genre == Genre::Comedy) 
     return "Comedy"; 
    if (Book.genre == Genre::Romance) 
     return "Romance"; 
    if (Book.genre == Genre::Mystery) 
     return "Mystery"; 
} 

// Mutators 
void Book::changeAuthor(string newAuthor) 
{ 
    author = newAuthor; 
} 

// Helper Functions 
bool operator==(const Book& a, const Book& b) 
{ 
    if (a.getISBN() != b.getISBN()) 
     return false; 
    if (a.getCopyrightYear() != b.getCopyrightYear()) 
     return false; 
    if (a.getTitle() != b.getTitle()) 
     return false; 
    if (a.getAuthor() != b.getAuthor()) 
     return false; 
    if (a.getGenre() != b.getGenre()) 
     return false; 

    return true; 
} 

bool operator!=(const Book& a, const Book& b) 
{ 
    return !(a==b); 
} 
} // End Biblo 
+1

Вы говорите, что попробовали 'Biblo :: Book :: Horror' - так и я, и он работает (clang ++ 3.6), поэтому опубликуйте информацию о своей программной цепочке и удалите из своего сообщения все несвязанные мусорные вещи, но * все еще * создает вашу проблему. [посмотреть его вживую] (http://ideone.com/0s6LY8). – WhozCraig

+0

Я пробовал ссылку, которая у вас была в вашем комментарии, и она тоже работала на моем конце. Не совсем уверен, что вы подразумеваете под toolchain, но я получаю следующую ошибку: C:/Users/Student/Dropbox/C++/Book Class/main.cpp: 8: неопределенная ссылка на 'Biblo :: Book :: Book (int, int, std :: string, std :: string, Biblo :: Book :: Genre) ' C:/Users/Student/Dropbox/C++/Book Class/main.cpp: 14: неопределенная ссылка на 'Biblo: : Book :: getGenre() const ' –

+0

Эта ошибка не имеет абсолютно никакого отношения к доступности вашего перечисления. – WhozCraig

ответ

1

Вам нужно включить класс перечисления. например .:

Biblio::Book::Genre::Horror

+1

Это было бы правдой, если бы это был класс перечисления, но это не так, это просто перечисление. –

3

Кажется, что вы испробовали все, но вещи вам нужно! enum вложен внутри класса Book, который находится в пространстве имен Biblo. Код, который вы ищете:

int main() 
{ 
    Biblo::Book book(100, 2012, "The Walrus", "The Eggman", Biblo::Book::Horror); 
    return 0; 
} 
+0

Используя это дает неопределенную опорную ошибку –

+0

Судя по комментариям в вашем вопросе, ваша новая проблема не имеет ничего общего с доступностью вашего 'enum' (спасибо @WhozCraig за слова и изначально указав это). Ваш вопрос касался доступа к вашему 'enum', на который это отвечает. Если у вас возникли другие проблемы, я предлагаю задать новый вопрос, чтобы не напасть на это (извините, если это звучит жестко, я имею в виду это наилучшим образом. Нет ничего плохого в том, чтобы задавать больше вопросов, если вы публикуете новые вопросы) – Tas

0

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

Если вы используете правильное пространство имен, быстро положить в фактической реализации для конструктора, и получить самую быструю отдачу для вашего перечисления (INT может работать), он должен работать, и, вероятно, выглядеть следующим образом:

#include <iostream> 
#include <string> 

using namespace std; 

namespace Biblo{ 

class Book{ 
public: 
    enum Genre{ 
     No_Genre, Horror, Comedy, Romance, Mystery 
    }; 
    // The rest of this header is working fine I think, just this enum 
    class Invalid{}; // Used for throwing errors 

    Book(int n_ISBN, int n_copyrightYear, string n_title, string n_author, Genre n_genre); 
    Book(); 

    // Accessors (non-modifying) 
    int getISBN() const { return ISBN; } 
    int getCopyrightYear() const { return copyrightYear; } 
    string getTitle() const { return title; } 
    string getAuthor() const { return author; } 
    int getGenre() const { return genre; } 

    // Mutators 
    void changeAuthor(string newAuthor); 
private: 
    int ISBN; 
    int copyrightYear; 
    string title; 
    string author; 
    Genre genre; 

}; // End Book 

Book::Book(int n_ISBN, int n_copyrightYear, string n_title, string n_author, Genre n_genre){ 
    ISBN = n_ISBN; copyrightYear = n_copyrightYear; title = n_title; author = n_author; 
}; 
} 
using namespace std; 

int main() 
{ 
    Biblo::Book book(100, 2012, "The Walrus", "The Eggman", Biblo::Book::Horror); // THIS LINE GIVES ERROR 

    cout << "ISBN: " << book.getISBN() << endl; 
    cout << "Copyright: " << book.getCopyrightYear() << endl; 
    cout << "Title: " << book.getTitle() << endl; 
    cout << "Author: " << book.getAuthor() << endl; 
    cout << "Genre: " << book.getGenre() << endl; 

    return 0; 
} 

Вы подаете в суд на книгу, за которой вы следите, не обсуждают такие детали, как списки инициализаторов или что-то еще для конструкторов, совпадающих с предметами, которые вы ищете, или до них?

Код выглядел несколько неполным. Отредактировано в строке здесь, на SO, так что медведь с плохим форматированием и объединенным просмотром h/cpp :)

+0

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

+0

У меня есть реализация в файле book.cpp, который включает в себя book.h мои конструкторы/не-встроенные функции есть. Я обновляю основную запись, чтобы показать book.cpp –

+0

Когда вы просите о помощи, я нахожу, что если вы можете собрать все вместе, чтобы кто-то мог просто вставить их в онлайн-службу, такую ​​как идеон, вы с большей вероятностью получите помощь. Сокращенные, но полные реализации, которые можно вставить и скопировать, помогают другим помочь вам. YMMV –

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