Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Наследование, вывод информации


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

Код

#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

Автор: hawk3500 1.6.2012, 20:37
Код

#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;
} 

Автор: disputant 1.6.2012, 20:37
А почему не просто 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;
        }


Автор: hawk3500 1.6.2012, 20:51
А если ещё более гибко то вот так.
Код

#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;
} 

Автор: Nerfair 2.6.2012, 22:45
Спасибо за примеры!


disputant
Цитата

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


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

Цитата

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


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

Цитата

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


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

hawk3500

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

Автор: disputant 3.6.2012, 07:41
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)