Реализация класса в программе базы данных

Итак, я новичок в 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))){

    }
}

Бьюсь об заклад, это, вероятно, очень простая проблема, но ни книга, ни другие ресурсы, на которые я ссылался, не смогли мне сильно помочь. Мы будем благодарны за любую помощь или совет! Спасибо!

С чем вам помочь?

smac89 26.10.2018 07:31

Относительно readBooks(): int books[] - плохой выбор для хранения книг с указанием названия, автора и т. д. Именно здесь вы должны предоставить контейнер с Book. Также плохой выбор - хранить объекты Book в массиве. (Как вы собираетесь управлять распределением памяти?) Намного проще и рекомендуется вместо этого использовать std::vector<Book>. Вы можете просто создать новые объекты push_back()Book, не возясь с любыми new или delete - std::vector сделает это за вас. (И, кстати, с std::vector::size() вы всегда можете запросить количество хранимых элементов, что невозможно с массивами.)

Scheff's Cat 26.10.2018 07:52
1
2
166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу помочь вам с дизайном вашего класса. Это выглядело бы примерно так:

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().

Другие вопросы по теме