Войти

Показать полную графическую версию : производный класс


Sky-er
21-01-2009, 04:31
Здравствуйте помогите разобраться имеется класс книга:
#include "stdafx.h"
#include <iostream>
using namespace std;

class Book{
char *author;
char *name;
char *janr;
int year;
public:
Book(char *au, char *nb, char *jr, int yr);

void set_author(char *au){author=au;} // Установка имени автора книги
void set_name(char *nb){name=nb;} // Установка названия книги
void set_janr(char *jr){janr=jr;} // Установка жанра книги
void set_year(int yr){year=yr;} // Установка года выпуска книги

// Функции "get", возвращение значений полей книги
char *get_author() {return author;}
char *get_name() {return name;}
char *get_janre() {return janr;}
int get_year() {return year;}

void printBook(); // Печать значений книги
void CalculateYearBook(); //Вычисление возраста книги
};

Book::Book(char *au, char *nb, char *jr, int yr)
// Выделение памяти
{
author = new char[strlen(au) + 1];
strcpy(author, au);
name = new char[strlen(nb) + 1];
strcpy(name, nb);
janr = new char[strlen(jr) + 1];
strcpy(janr, jr);
year=yr;
}


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: "<<name<<endl;
cout<<" Janre Book: "<<janr<<endl;
cout<<" Year Book: "<<year<<endl;

}
void main()
{
Book b("Servantes", "Don Kixot", "Romantic", 1950);
b.printBook();
b.CalculateYearBook();
b.set_author("Pushkin");
b.set_name("Lukomorie");
b.set_janr("skazki");
b.set_year(1968);
b.printBook();
b.CalculateYearBook();
}

Создать производный класс типа – учетная карточка наименования в библиотеке. Доопределить в нем поля: шифр, количество экземпляров, количество выдач наименования по запросу; методы: установки полей и получения значений полей, определения коэффициента востребованности наименования (относительно общего количества экземпляров наименования). Переопределить метод печати.

Я думаю, что должно выглядеть вот так
#include "stdafx.h"
#include <iostream>
using namespace std;

class Book{
protected:
char *author;
char *name;
char *janr;
int year;
public:
Book(char *au, char *nb, char *jr, int yr);

void set_author(char *au){author=au;}
void set_name(char *nb){name=nb;}
void set_janr(char *jr){janr=jr;}
void set_year(int yr){year=yr;}

char *get_author() {return author;}
char *get_name() {return name;}
char *get_janre() {return janr;}
int get_year() {return year;}

void printBook();
void CalculateYearBook();
};

Book::Book(char *au, char *nb, char *jr, int yr)
{
author = new char[strlen(au) + 1];
strcpy(author, au);
name = new char[strlen(nb) + 1];
strcpy(name, nb);
janr = new char[strlen(jr) + 1];
strcpy(janr, jr);
year=yr;
}


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: "<<name<<endl;
cout<<" Janre Book: "<<janr<<endl;
cout<<" Year Book: "<<year<<endl;
}

class library_card:public Book
{
int shifr;
int exeplyars;
int vydachi;
public:
library_card(int sh, int kol_ex, int kol_vyd);

void set_shifr(int sh){shifr=sh;}
void set_exeplyars(int kol_ex){exeplyars=kol_ex;}
void set_vydachi(int kol_vyd){vydachi=kol_vyd;}

int get_shifr() {return shifr;}
int get_exeplyars() {return exeplyars;}
int get_vydachi() {return vydachi;}

void printlibrary_card();
void vostrebovannost();
};
library_card::library_card(char *au, char *nb, char *jr, int yr, int sh , int kol_ex, int kol_vyd):
Book(author, name, janr, year)// сдесь ругается ??
{
shifr=sh;
exeplyars=kol_ex;
vydachi=kol_vyd;
}

void library_card::vostrebovannost()
{
}
void library_card::printlibrary_card()
{
printBook();
cout<<" shifr: "<<shifr<<endl;
cout<<" exeplyars: "<<exeplyars<<endl;
cout<<" vydachi: "<<vydachi<<endl;
}

void main()
{
Book b("Servantes", "Don Kixot", "Romantic", 1950);
b.printBook();
b.CalculateYearBook();
b.set_author("Pushkin");
b.set_name("Lukomorie");
b.set_janr("Skazki");
b.set_year(1968);
b.printBook();
b.CalculateYearBook();
card.printlibrary_card();
}

И дальше то, что я совсем непонимаю как сделать
Написать программу «Электронный каталог библиотеки», создающую картотеку библиотеки, позволяющую делать запрос на определенную книгу, выводить на экран список востребованных наименований с указанием коэффициента, изменять данные наименования (по частям и полностью), искать книгу по заданному параметру (шифр, название, автор, вид литературы) и печатать на экран содержимое каталога.

Busla
21-01-2009, 11:49
Так в чём же дело? - Чисто механическая работа, которая делается после прочтения одной-двух коротких глав учебника специально глянул объём необходимого материала у Страуструпа.

А не смущает, что конструктор и методы присвоения для полей реализованы совсем неодинаково? ;-)

Drongo
25-01-2009, 13:32
А не смущает, что конструктор и методы присвоения для полей реализованы совсем неодинаково? ;-) »А если так?
...
// Реализация
Book::Book(char *au, char *nb, char *jr, int yr)
{
set_author(au);
set_name(nb);
//Дальше, остальные функции
//...
}
// Реализация функций присваивания
// Функция присваивания автора
void Book::set_author(char *au)
{
author = au;
}
// Функция присваивания имени
void Book::set_name(char *nb)
{
name = nb;
}
//...

Busla
25-01-2009, 14:54
Sky-er, не надо редактировать свои сообщения без лишней необходимости.

И дальше то, что я совсем непонимаю как сделать »
Это потому, что задание с производным классом мало относится к созданию программы учёта. Например, сущность "книга" там вообще не нужна, по крайней мере в такой реализации.

Drongo, в первоначальной реализации конструктор создавал новые строки в объекте. В твоём варианте конструктор хранит адрес какой-то внешней строки, вот что получается:

:цикл
вывод: введите название новой книги
ввод: name
новый объект со ссылкой на name
повторяем?

в итоге все объекты будут ссылаться на переменную name, где находится название последней книги

Sky-er
26-01-2009, 00:08
Это потому, что задание с производным классом мало относится к созданию программы учёта. Например, сущность "книга" там вообще не нужна, по крайней мере в такой реализации. »

Это просто первое задание было создать класс книга, потом сделать производный класс от него ну а дальше как написанно каталог библиотеки просто они связанны наверно должны быть я так думаю, а не менять полностью весь код для написания каталога библиотеки




© OSzone.net 2001-2012