Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование, вывод информации 
:(
    Опции темы
Nerfair
Дата 1.6.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



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

Код

#include <iostream>
//#include <cstdlib>

using namespace std;

class Book {
    private:
        char *Name;
        char *Author;
        int Count;

    public:
        Book(int a);            // Конструктор
        ~Book();                // Деструктор

        void Store (char *a, char *b, int c) {
            Name = a;
            Author = b;
            Count = c;
        }

        void Store (char *a, char *b) {
            Name = a;
            Author = b;
            Count = 0;
        }

        void Show () {
            cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
        }

};


Book::Book(int a) {
    cout << endl << "Constructor " << a << " initialized;" << endl;
}

Book::~Book() {
    cout << "Destructor initialized;" << endl;
}


class OldBook: public Book {
    private:
        int year;
    public:
        OldBook(int a) : Book(a) {};

        void SetYear(int a) {
            year = a;
        }
        void OldShow() {
            Show();
            cout << "Year: " << year << endl;
        }
};

void main() {

    // Класс Book
    Book BookOne(1);

    BookOne.Store("Tom Sawyer", "Mark Twain", 1);
    BookOne.Show();

    Book BookTwo(2);

    BookTwo.Store("The Financier", "Theodore Dreiser");
    BookTwo.Show();

    // Класс OldBook
    OldBook BookThree(3);

    BookThree.Store("The Old Man and the Sea", "Ernest Hemingway");    // Наследуем метод Store класса Book
    BookThree.SetYear(1952);
    BookThree.OldShow();

    // Конец
    cout << endl;
} 


А конкретно 
Код

void Show () {
            cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
        }

Код

void OldShow() {
            Show();
            cout << "Year: " << year << endl;
        }


Хотелось бы услышать Ваш пример реализации этого момента smile
PM MAIL   Вверх
hawk3500
Дата 1.6.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



Код

#include <iostream>
//#include <cstdlib>

using namespace std;

class Book {
    public:
        Book(int a);            // Конструктор
        ~Book();                // Деструктор
    char *Name;
        char *Author;
        int Count;

        void Store (char *a, char *b, int c) {
            Name = a;
            Author = b;
            Count = c;
        }

        void Store (char *a, char *b) {
            Name = a;
            Author = b;
            Count = 0;
        }

        void Show () {
            cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
        }

};


Book::Book(int a) {
    cout << endl << "Constructor " << a << " initialized;" << endl;
}

Book::~Book() {
    cout << "Destructor initialized;" << endl;
}


class OldBook: public Book {
    private:
        int year;
    public:
        OldBook(int a) : Book(a) {};

        void SetYear(int a) {
            year = a;
        }
        void OldShow() {
            cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
            cout << "Year: " << year << endl;
        }
};

void main() {

    // Класс Book
    Book BookOne(1);

    BookOne.Store("Tom Sawyer", "Mark Twain", 1);
    BookOne.Show();

    Book BookTwo(2);

    BookTwo.Store("The Financier", "Theodore Dreiser");
    BookTwo.Show();

    // Класс OldBook
    OldBook BookThree(3);

    BookThree.Store("The Old Man and the Sea", "Ernest Hemingway");    // Наследуем метод Store класса Book
    BookThree.SetYear(1952);
    BookThree.OldShow();

    // Конец
    cout << endl;
} 

--------------------
воин dzen'a
PM MAIL   Вверх
disputant
Дата 1.6.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



А почему не просто Show, а именно OldShow?

Код

void Show() {
       Book::Show();
       cout << "Year: " << year << endl;
}


И вообще - думаю, имеет смысл сделать метод виртуальным...
И еще - достаточно одного метода Store:

Код

 void Store (char *a, char *b, int c = 0) {
            Name = a;
            Author = b;
            Count = c;
        }


PM MAIL   Вверх
hawk3500
Дата 1.6.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



А если ещё более гибко то вот так.
Код

#include <iostream>
//#include <cstdlib>

using namespace std;
class OldBook;
class Book {
    private:
      friend class OldBook;
        char *Name;
        char *Author;
        int Count;

    public:
        Book(int a);            // Конструктор
        ~Book();                // Деструктор

        void Store (char *a, char *b, int c) {
            Name = a;
            Author = b;
            Count = c;
        }

        void Store (char *a, char *b) {
            Name = a;
            Author = b;
            Count = 0;
        }

        void Show () {
            cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
        }

};


Book::Book(int a) {
    cout << endl << "Constructor " << a << " initialized;" << endl;
}

Book::~Book() {
    cout << "Destructor initialized;" << endl;
}


class OldBook: public Book {
    private:
        int year;
    public:
        OldBook(int a) : Book(a) {};

        void SetYear(int a) {
            year = a;
        }
        void OldShow() {
             cout << "Name: " << Name << endl << "Author: " << Author << endl << "Count: " << Count << endl;
            cout << "Year: " << year << endl;
        }
};

void main() {

    // Класс Book
    Book BookOne(1);

    BookOne.Store("Tom Sawyer", "Mark Twain", 1);
    BookOne.Show();

    Book BookTwo(2);

    BookTwo.Store("The Financier", "Theodore Dreiser");
    BookTwo.Show();

    // Класс OldBook
    OldBook BookThree(3);

    BookThree.Store("The Old Man and the Sea", "Ernest Hemingway");    // Наследуем метод Store класса Book
    BookThree.SetYear(1952);
    BookThree.OldShow();

    // Конец
    cout << endl;
} 

--------------------
воин dzen'a
PM MAIL   Вверх
Nerfair
Дата 2.6.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Спасибо за примеры!


disputant
Цитата

А почему не просто Show, а именно OldShow?


У меня во время написания кода, были проблемы, что выдавало ошибку о перегрузке функции, в итоге изменил название, но после всех фиксов так все и осталось, сейчас проверил, на самом деле незачем менять название метода.

Цитата

достаточно одного метода Store


Не понял что Вы имеете ввиду.

Цитата

имеет смысл сделать метод виртуальным


Пока не знаком :(
Спасибо за напутствия! 

hawk3500

Большие спасибо, я еще не знаком с "friend" классами, но код посмотрел, для себя вынес и усёк некоторые моменты.  smile 

Это сообщение отредактировал(а) Nerfair - 2.6.2012, 22:48
PM MAIL   Вверх
disputant
Дата 3.6.2012, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(Nerfair @ 2.6.2012,  22:45)
Цитата

достаточно одного метода Store


Не понял что Вы имеете ввиду.




Использование параметра по умолчанию.

Попробуйте вместо двух методов Store
оставить один - с тремя параметрами, но В ОБЪЯВЛЕНИИ указать не просто int c в качестве последнего параметра, а int c = 0. Для компилятора это означает, что если вы передаете только два параметра, то третий будет добавлен автоматически. А так как у вас методы совершенно идентичные, и метод с двумя параметрами - это тот же метод с тремя, только третий - нулевой, то нет смысла их размножать.

В самом худшем варианте можно оставить оба, но реализовать тот, что с двумя параметрами, через тот, что с тремя:
Код

void Store (char *a, char *b) {
    Store(a,b,0);
}


По крайней мере в случае внесения изменений в логику это изменение придется вносить в одном месте, а не в нескольких  smile 

Цитата(Nerfair @ 2.6.2012,  22:45)

Большие спасибо, я еще не знаком с "friend" классами, но код посмотрел, для себя вынес и усёк некоторые моменты. 

Тут мне хочется сказать прямо - я не понимаю, зачем в данном случае делать класс OldBook другом в частности, и зачем делать класс, наследуемый с public, другом в общем случае. У меня в этом случае сложилось ощущение какой-то не понятой мною шутки... smile 


Это сообщение отредактировал(а) disputant - 3.6.2012, 07:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.