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


Автор: Павлуха 1.10.2006, 14:00
помогите пжалста вот простенькая программка, но выводит какую-то лабуду smile  что здесь не так??????
Код

#include <iostream.h>
#include <string.h>
class book
{    
    char avtor[20];
    char name[20];
public:
    
void set(char* a, char* n){strcpy(avtor,a); strcpy(name,n);}
    void print()
    {
        cout<<avtor<<'\n'<<name;
    }};
class book2:public book
{
    int year;
    char isd[20];
    int kol;
    int kosht;
    public:
    void set(int y, char* i, int k,int c )
    {y=year; strcpy(isd,i); k=kol; c=kosht;}
    void print()
    {
        book::print();
        cout<<year<<'\n'<<isd<<'\n'<<kol<<'\n'<<kosht;
    }};
void main()
{
book ob;
ob.set("hutin","les");
book2 obb;
obb.set(1992,"PITER",10,15000);
obb.print();
}

Автор: EvgenZ 1.10.2006, 14:27
strcpy(avtor,a); ноль байт не добавляешь...

Автор: Antropoid 1.10.2006, 14:27
Код

    void set(int y, char* i, int k,int c)
//    {y=year; strcpy(isd,i); k=kol; c=kosht;}//не так
    {year=y; strcpy(isd,i); kol=k; kosht=c;}//а так

Код

    void print()
    {
    book::print();//здесь печатается мусор, потому что поля "avtor" и "name" не инициализированы
    cout<<year<<'\n'<<isd<<'\n'<<kol<<'\n'<<kosht;
    }};

можно делать,например,так
Код

    void print()
    {
    book::set("AVTOR","NAME");
    book::print();
    cout<<year<<'\n'<<isd<<'\n'<<kol<<'\n'<<kosht;
    }};


Автор: Oleg_Ci 1.10.2006, 14:29
Вроде всё исправил smile 
Код

#include <iostream>
#include <string.h>
using std::cout;

class book
{    
    char avtor[20];
    char name[20];
public:
    book(){ avtor[0] = 0; name[0] = 0; }
void set(char* a, char* n){strcpy(avtor,a); strcpy(name,n);}
    void print()
    {
        cout<<avtor<<'\n'<<name;
    }};
class book2:public book
{
    int year;
    char isd[20];
    int kol;
    int kosht;
public:
    book2(): year(0), kol(0), kosht(0)
    { isd[0]=0;}
    void set(int y, char* i, int k,int c )
    {year=y; strcpy(isd,i); kol=k; kosht=c;}
    void print()
    {
        book::print();
        cout<<year<<'\n'<<isd<<'\n'<<kol<<'\n'<<kosht;
    }};
void main()
{
book ob;
ob.set("hutin","les");
ob.print();
book2 obb;
obb.set(1992,"PITER",10,15000);
obb.print();
getchar();
}

Автор: Kuvaldis 1.10.2006, 16:27
Павлуха, 
Вообще-то какой -то странный класс book2. Зачем его делать производным от book, если ты нигде не используешь данных, определенных в базовом классе? И ни в конструкторе, ни в методе set ты не присваиваешь этим полям значение?

Лучше сделать так. В производном методе set вызывается базовый метод set для установки полей базового класса (так хоть смысл есть)
Код

//*****************************************************************************
#include <iostream>
#include <conio.h>
#include <string.h>
using std::cout;
//*****************************************************************************
class book
{
    char avtor[20];
    char name[20];
public:
    book()
    {
       avtor[0] = 0;
       name[0] = 0;
    }
    void set(char* a, char* n)
    {
       strcpy(avtor,a);
       strcpy(name,n);
    }
    void print()
    {
        cout << avtor << '\n' << name << '\n';
    }
};
//*****************************************************************************
class book2 : public book
{
    int year;
    char isd[20];
    int kol;
    int kosht;
public:
    book2(): year(0), kol(0), kosht(0) { isd[0] = 0; }
    void set(char* a, char* n, int y, char* i, int k,int c )
    {
        book::set(a, n);
        year=y; strcpy(isd,i);
        kol=k;
        kosht=c;
    }
    void print()
    {
        book::print();
        cout<<year<<'\n'<<isd<<'\n'<<kol<<'\n'<<kosht;
    }
};
//*****************************************************************************
void main()
{
    book ob;
    cout << "\n\nBook\n";
    ob.set("hutin","les");
    ob.print();
    book2 obb;
    cout << "\n\nBook2\n";
    obb.set("hutin","les", 1992,"PITER",10,15000);
    obb.print();
    getch();    
}
//*****************************************************************************

Автор: Xenon 1.10.2006, 16:55
Kuvaldis, человек, скорее всего, просто упражняется в наследовании smile

Автор: Павлуха 1.10.2006, 18:00
Цитата(Xenon @ 1.10.2006,  16:55)
Kuvaldis, человек, скорее всего, просто упражняется в наследовании smile

Именнно так smile 
СПАСИБО всем!

Автор: sergejzr 15.11.2006, 15:32
Модератор: Название темы должно отражать ее суть!

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