Итак, я новичок в C++, и мне трудно понять, как реализовать классы в функции, которая у меня есть. Мой проф не помогает ни в каком качестве, и я очень потерян.
Таким образом, суть программы состоит в том, чтобы взять файл "books.txt", где каждая строка содержит автора и книгу в следующем формате: Дуглас Адамс, Автостопом по Галактике.
Я пытаюсь получить функцию для заполнения массива объектами «Книга» с заголовком и данными об авторе из файла. Он принимает 4 входных аргумента: имя файла в виде строки, массив объектов «Книга», количество объектов «Книга», хранящихся в массиве Книги, и емкость библиотечной системы (максимум 200 ).
Для каждой строки в файле я должен создать экземпляр объекта Book, заполнить элементы данных author и title (перечисленные в приведенном ниже коде) и добавить объект в массив объектов "Book", и он вернет числа. книг в системе как целое число.
Вот мой заголовочный файл (Book.h):
#include <iostream>
#include <math.h>
#include <string>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <cctype>
#include <locale>
#include <algorithm>
using namespace std;
#ifndef BOOK_H
#define BOOK_H
class Book{
private: //Member Variables
string author;
string title;
string inauthor;
string intitle;
string input;
string input2;
public:
Book();
Book(string intitle, string inauthor);
string getTitle();
void setTitle(string input);
string getAuthor();
void setAuthor(string input2);
};
#endif
Вот файл .cpp, связанный с файлом заголовка:
#include <iostream>
#include <math.h>
#include <string>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <cctype>
#include <locale>
#include <algorithm>
#include "Book.h"
using namespace std;
//Default constructor
Book::Book(){
author = "";
title = "";
}
//Parameterized Constructor
Book::Book(string intitle, string inauthor){
}
//An accessor function that returns the name of the title
string Book::getTitle() {
return title;
}
//A function that assigns the value title to the input given by the user
void Book::setTitle(string title){
title = intitle;
}
//An accessor function that returns the name of the author
string Book::getAuthor() {
return author;
}
//A function that assigns the value author to the input given by the user
void Book::setAuthor(string author){
author = inauthor;
}
И, наконец, вот функция, в которую я пытаюсь поместить ее (она неполная, поскольку все предыдущие попытки использовать классы заканчивались длинным списком ошибок, и вот где я могу с уверенностью сказать, что смогу добраться):
#include <iostream>
#include <math.h>
#include <string>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <cctype>
#include <locale>
#include <algorithm>
#include "Book.h"
#include "User.h"
using namespace std;
int readBooks (string filename, int books[] , int bookObj, int capacity){
int i = 0;
ifstream file;
file.open (filename);
if (file.fail()){
return -1;
}
else{
string line;
while ((i < books) && (i < capacity) && (getline(file,line))){
}
}
Бьюсь об заклад, это, вероятно, очень простая проблема, но ни книга, ни другие ресурсы, на которые я ссылался, не смогли мне сильно помочь. Мы будем благодарны за любую помощь или совет! Спасибо!
Относительно readBooks()
: int books[]
- плохой выбор для хранения книг с указанием названия, автора и т. д. Именно здесь вы должны предоставить контейнер с Book
. Также плохой выбор - хранить объекты Book
в массиве. (Как вы собираетесь управлять распределением памяти?) Намного проще и рекомендуется вместо этого использовать std::vector<Book>
. Вы можете просто создать новые объекты push_back()
Book
, не возясь с любыми new
или delete
- std::vector
сделает это за вас. (И, кстати, с std::vector::size()
вы всегда можете запросить количество хранимых элементов, что невозможно с массивами.)
Я могу помочь вам с дизайном вашего класса. Это выглядело бы примерно так:
Book.h
#ifndef BOOK_H
#define BOOK_H
#include <string>
#include <vector>
const int LIBRARY_MAX_CAPACITY = 200;
class Book {
private:
std::string author_;
std::string title_;
public:
Book() : author_( "" ), title_( "" ) {}
Book( const std::string& authorIn, const std::string& titleIn ) :
author_( authorIn ), title_( titleIn )
{}
void setAuthor( const std::string& authorIn ) {
this->author_ = authorIn;
// or just author_ = authorIn;
}
void setTitle( const std::string& titleIn ) {
this->title_ = titleIn;
// or just title_ = titleIn;
}
std::string getAuthor() const { return author_; }
std::string getTitle() const { return title_; }
};
void readBooks( const std::string& filename, std::vector<Book>& books );
#endif // BOOK_H
Book.cpp
#include "Book.h"
#include <fstream>
// this is just pseudo code and will not actually compile
void readBooks( const std::string& filename, std::vector<Book>& books ) {
// open file, test if open correctly
std::ifstream file;
file.open( filename );
// loop through file until end is reached by reading in
// a line of code and getting the contents of the book
while ( file still has data && line <= LIBRARY_MAX_CAPACITY ) {
// get a line of text then parse that line of text.
std::string author = "first string from file before comma"
std::string title = "second string from file after comma"
// create a book object here:
Book book( author, title );
// push back into vector that is passed into this function by reference
books.push_back( book );
}
// done with loop close the file
file.close();
}
Теперь любая другая функция, вызывающая эту функцию, например main или ваш класс библиотеки и т. д., Будет передана обратно по ссылке, которая уже заполнена объектами книг, а std::vector<Book>
имеет функцию std::vector<>
, которая возвращает его размер как .size()
.
С чем вам помочь?