В общем немного решил, но я сам запутался, знаний нехватает. Самому интересно.
У меня вопрос:
1. Как организовать ввод данных с клавиатуры?
2. И как правильно записать деструктор?
Я запутался...
По первому вопросу придумал так:
В определении класса объявляю функцию
Код:
void UserFromKeyboard();
В реализации этой функции считываю через дополнительные переменные, данные, и передаю в функции установки "set", каждое значение в свою функцию, но выпадает ошибка о том что приложение будет закрыто. Причём если только одно значение считывается и передаётся, то программа работает, а если четыре, то никак. Ошибки выскакивают при вводе символьных значений задачи. Подскажите как правильно ввести с клавиатуры значения и сохранить\присвоить полям объекта?
Решение
Код:
// Создать класс типа — книга.
// Поля — название, автор, год выпуска, вид литературы (худож., методич., справочн., ...).
// Класс имеет конструктор, деструктор.
// Методы: установки и возвращения значения полей, вычисления «возраста» книги,
// Метод печати.
// Методы установки полей класса должны проверять корректность задаваемых параметров.
// Проверить работу этого класса
//#include "stdafx.h"
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;
#include <cstring.h>
#include <cassert>
//#include "math.h"
//#include <stdarg.h>
#include <stdio.h>
#include "conio.h"
//#define _CRT_NONSTDC_NO_DEPRECATE
class Book{
public:
Book(char *au, char *nb, char *jr, int yr); // Конструктор
// void UserFromKeyboard();
//void setBook(char *au, char *nb, char *jr, int yr);
// Функции "set", установки значений полей книги
void setAuthorBook(char *au); // Установка имени автора книги
void setNameBook(char *nb); // Установка названия книги
void setJanreBook(char *jr); // Установка жанра книги
void setYearBook(int yr); // Установка года выпуска книги
// Функции "get", возвращение значений полей книги
char *getAuthorBook() { return author; } ;// Возвращение имени автора книги
char *getNameBook() { return nameBook; }; // Возвращение названия книги
char *getJanreBook() { return janr; }; // Возвращение жанра книги
int getYearBook() { return year; };// Возвращение года выпуска книги
void printBook(); // Печать значений книги
void CalculateYearBook();
~Book(); // Деструктор
private:
char *author;
char *nameBook;
char *janr;
int year;
};
// Конструктор----------------------------------------------------------------
Book::Book(char *au, char *nb, char *jr, int yr)
{
setAuthorBook(au);
setNameBook(nb);
setJanreBook(jr);
setYearBook(yr);
}
// Функция ввода данных значений книги с клавиатуры
//void Book::UserFromKeyboard()
//{
//}
// Функция установки Автора Книги
void Book::setAuthorBook(char *au)
{
// Проверка и выделение памяти для поля - Автор
int len = strlen(au);
if( 0 <= len && len < 256){ // Проверка диапазона, должен быть меньше 255
author = new char[strlen(au) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(author != 0); // Проверка выделения памяти
strcpy(author, au); // Копирование...
}
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Названия книги
void Book::setNameBook(char *nb)
{
// Проверка и выделение памяти для поля - Имя Книги
int len = strlen(nb);
if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
nameBook = new char[strlen(nb) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(nameBook != 0); // Проверка выделения памяти
strcpy(nameBook, nb); // Копирование...
}
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Жанра Книги
void Book::setJanreBook(char *jr)
{
// Проверка и выделение памяти для поля - Жанр
int len = strlen(jr);
if(len >= 0 && len < 256){ // Проверка диапазона, должен быть меньше 255
janr = new char[strlen(jr) + 1]; // Выделение памяти в 255 байт плюс завершающий символ
assert(janr != 0); // Проверка выделения памяти
strcpy(janr, jr); // Копирование...
}
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Lenght > 256 bytes!";
}
// Функция установки Года Книги
void Book::setYearBook(int yr)
{
// Проверка значений поля - Год Книги
if(yr < 2008) // Проверка диапазона, должен быть меньше 255
year = yr;
else // Вывод ошибки если диапазон массива меньше нуля и больше 256 байт...
cout<<" Error! Year > 2008 !";
}
// Расчёт возраста Книги
void Book::CalculateYearBook()
{
int MyYear = 2008, // Текущий год
resultYear; // Результат расчёта возраста книги
resultYear = MyYear - year;
cout<<"\n This Book "<<resultYear<<" Years! \n"<<endl;
}
// Печать объекта-------------------------------------------------------------
void Book::printBook()
{
cout<<" Author Book: "<<author<<endl;
cout<<" Name Book: "<<nameBook<<endl;
cout<<" Janre Book: "<<janr<<endl;
cout<<" Year Book: "<<year<<endl;
}
// Деструктор-----------------------------------------------------------------
Book::~Book()
{
}
//---------------------------------------------------------------------------
void main()
{
int z;
Book b("Servantes", "Don Kixot", "Romantic", 1550);
b.printBook();
b.CalculateYearBook();
b.setAuthorBook("Pushkin");
b.setNameBook("Eugeny Onegin");
b.setJanreBook("Roman");
b.setYearBook(1834);
b.printBook();
b.CalculateYearBook();
cin>>z;
}
//---------------------------------------------------------------------------