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