Технический форум

Технический форум (http://www.tehnari.ru/)
-   C/C++/С# (http://www.tehnari.ru/f42/)
-   -   Для класса "Футболист" создать производный класс "Нападающий" и "Защитник" ООП С++ (http://www.tehnari.ru/f42/t246566/)

Pantera19 24.05.2016 12:30

Для класса "Футболист" создать производный класс "Нападающий" и "Защитник" ООП С++
 
класс ФУТБОЛИСТ с атрибутами: фамилия, название команды, рост, вес и методами: посмотреть всю информацию об объекте класса, изменить рост, из-менить вес. Для класса ФУТБОЛИСТ создать производный класс НАПАДАЮЩИЙ со своими атрибутами: мастерство (целочисленный параметр), количество забитых голов и методами: забить гол, посмотреть всю информацию об объекте (заместить соответствующий метод). Для класса ФУТБОЛИСТ создать производный класс ЗАЩИТНИК со своими атрибутами: общее количество матчей с участием объекта, количество выигранных матчей с участием объекта и методами: увеличить общее количество матчей, увеличить количество выигранных матчей.
Определить внешний метод (не являющийся методом данного класса), который запрашивает у пользователя и устанавливает новое значение для свойства: мастерство объекта класса ФУТБОЛИСТ. Параметром данного метода должна быть ссылка на объект, свойство которого следует изменить.

Код:

#include <iostream>
#include "footballer.h"
using namespace std;
int main()
{
    attacking A();
    A.footballer::print();
    A.print();
    A.transform();
    quarterback B();
    B.print();
    system("pause");
    return 0;
}

Код:

class footballer {
private:
    char * surname;
    char * team;
    float rost;
    float  weight; //вес
public:
    footballer( char * ="Name", char * ="team",  float=0.0, float =0.0);
    footballer(const footballer &);
    footballer & operator=(const footballer & );    //опер присваивания
    ~footballer();
    void print()const;
    void setrost();
    void setweight();
};


class attacking: public footballer {
private:
    unsigned short mastery;
    int gol;
public:
    attacking( unsigned short=12, int=2, char * ="Name 2 ", char * ="team ",float=175.1,float=69.5);
    attacking(const attacking & A);
    friend void transform( const  attacking &);
    attacking & operator=(const attacking & );
    ~attacking();
    void print()const;
    void setgol();
};

class quarterback: footballer {
private:
    int matches;
    int victory;
public:
    quarterback( int=1, int=0, char * ="Name 3" , char * ="team ", float=170.8 , float=75.0);
    quarterback( const quarterback & A);
    quarterback & operator=(const quarterback & );
    ~quarterback();
    void setmatches()const;
    void setvictory()const;
};

Код:

#include <iostream>
#include "footballer.h"
using namespace std;
footballer::footballer(char * a, char * b, float c,float d):
surname(a),team(b)
{
    surname=new char[strlen(a)+1];
    strcpy(a,surname);
    team=new char[strlen(b)+1];
    strcpy(b,team);
}

footballer::footballer(const footballer &A)
{
 surname = new char[strlen(A.surname)+1];
 strcpy(surname,A.surname);
 team= new char[strlen(A.team)+1];
 strcpy(team,A.team);
 weight=A.weight;
 rost=A.rost;
}


footballer::~footballer()
{
    delete[]surname;
    delete[]team;
}

footballer & footballer ::operator=(const footballer &  A)
{
    if (this!=&A)
    {
        surname=new char[strlen(A.surname)+1];
        team=new char[strlen(A.team)+1];
        weight=A.weight;
        rost=A.rost;
    }
    return *this;
}

       


void footballer::setrost()
{
    cout<<"\n Enter rost";
    cin>>rost;
}

void footballer::setweight()
{
    cout<<"\n Enter weight";
    cin>>weight;
}

void footballer::print()const
{
    cout<<"footballer:"<<surname<<"rost"<<rost<<"weight"<<weight<<"team"<<team;
}

///////////////////////////////////


attacking::attacking( unsigned short f, int k,char a, char b,float  * c,float * d):footballer(a,b,c,d)
{
    mastery=f;
    gol=k;
}


attacking::attacking(const attacking & A):footballer(A)
{
    mastery=A.mastery;
    gol=A.gol;
}
attacking::~attacking(){}

attacking & attacking:: operator=(const attacking & )
{
        if (this!=&A)
    {
        mastery=A.mastery;
        gol=A.gol;
    }
    return *this;
}


void attacking::setgol()
{
    gol++;
}

void attacking::print()const
{
    cout<<"footballer:"<<surname<<"mastery"<<mastery<<"gol"<<gol;
}


////////////////////////////////////////
quarterback::quarterback (int m, int n, char a, char b, float * c,float * d):footballer(a,b,c,d)
{    matches=m;
      victory=n;
}

quarterback::quarterback( const quarterback & A)
{
    mathes=A.matches;
    victory=A.victory;
}

quarterback::~quarterback(){}

quarterback & quarterback::  operator=(const quarterback & )
{
    if (this!=&A)
    {
        mathes=A.matches;
        victory=A.victory;
    }
    return *this;
}

void quarterback::mathes()
{
    mathes++;
}

void quarterback::victory()
{
    victory++;
}

void transform( const  attacking &)
{
  cout<<endl<<"enter mastersto quarterback";
  cin>>attacking.mastery;
}

помогите написать главную функцию ,у меня выдает ошибки я не могу понять их
1>g:\ооп\oop3\oop3\footballer.cpp(65) : error C2511: attacking::attacking(unsigned short,int,char,char,float *,float *): перегруженная функция-член не найдена в 'attacking'
1> g:\ооп\oop3\oop3\footballer.h(18): см. объявление 'attacking'
1>g:\ооп\oop3\oop3\footballer.cpp(140) : fatal error C1004: непредвиденное обнаружение конца файла
1>main.cpp
1>g:\ооп\oop3\oop3\main.cpp(7) : error C2228: выражение слева от ".print" должно представлять класс, структуру или объединение
1>g:\ооп\oop3\oop3\main.cpp(7) : error C2662: footballer::print: невозможно преобразовать указатель 'this' из 'attacking (__cdecl *)(void)' в 'const footballer &'
1> Причина: невозможно преобразовать 'attacking (__cdecl *)(void)' в 'const footballer'
1> Для преобразования требуется второй оператор пользовательского преобразования или конструктор
1>g:\ооп\oop3\oop3\main.cpp(8) : error C2228: выражение слева от ".print" должно представлять класс, структуру или объединение
1>g:\ооп\oop3\oop3\main.cpp(9) : error C2228: выражение слева от ".transform" должно представлять класс, структуру или объединение
1>g:\ооп\oop3\oop3\main.cpp(11) : error C2228: выражение слева от ".print" должно представлять класс, структуру или объединение
1>Создание кода...

grelly 24.05.2016 13:14

все очень плохо) попозже попробую расписать ошибки.

grelly 24.05.2016 14:51

основной файл
Код:

#include <iostream>
#include "footballer.h"
using namespace std;
int main()
{
    attacking A;
    ///A.footballer::print(); /// напрямую не сработает. надо приводить А к классу footballer, и только тогда вызывать функцию
    A.print();
    transform(A); /// transform не является членом класса attacking
    quarterback B;
    B.print();
        std::cout<<std::endl; /// переход на новую строку
    system("pause");
    return 0;
}

footballer.h
Код:

class footballer {
protected: /// Использовать protected вместо private, если нужен доступ из дочерних классов. Согласно идеологии ООП нужно доступ осуществлять через Get-функции
    char * surname;
    char * team;
    float rost;
    float  weight; //вес
public:
    footballer( char * nameDef ="Name", char *teamDef ="team",  float rostDef=0.0, float weightDef=0.0); /// добавить имена для переменных, значения по-умолчанию свести в конструктор, если не заданы иные
    footballer(const footballer &A);
    footballer & operator=(const footballer & A);    //опер присваивания
    ~footballer();
    void print()const; /// зачем const
    void setrost();
    void setweight();
};


class attacking: public footballer
{
private:
    unsigned short mastery;
    int gol;
public:
    attacking( unsigned short masteryDef=12, int golDef=2, char *nameDef ="Name 2 ", char *teamDef ="team ",float rostDef=175.1,float weightDef=69.5);
    attacking(const attacking & A);
    friend void transform( const  attacking & A);
    attacking & operator=(const attacking & A);
    ~attacking();
    void print()const;
    void setgol();
};

class quarterback: public footballer {/// надо определить тип наследования(в данном случае public)
private:
    int matches;
    int victory;
public:
    quarterback( int matchesDef=1, int victoryDef=0, char *nameDef ="Name 3" , char *teamDef ="team ", float rostDef=170.8 , float weightDef=75.0);
    quarterback( const quarterback & A);
    quarterback & operator=(const quarterback & A);
    ~quarterback();
    void setmatches(); /// зачем const
    void setvictory();
};

void transform( const  attacking &A);

footballer.cpp
Код:

#include <iostream>
#include "footballer.h"
using namespace std;
footballer::footballer(char *nameDef, char *teamDef,  float rostDef, float weightDef)
///:surname(a),team(b) /// это что вообще такое?)
{
    surname=new char[strlen(nameDef)+1];
    strcpy(surname, nameDef); /// первый параметр показывает куда копировать, второй - откуда
    team=new char[strlen(teamDef)+1];
    strcpy(team, teamDef);

        weight=weightDef;/// в конструкторе надо не забывать инициализировать переменные
        rost=rostDef;
}

footballer::footballer(const footballer &A)
{
 surname = new char[strlen(A.surname)+1];
 strcpy(surname,A.surname);
 team= new char[strlen(A.team)+1];
 strcpy(team,A.team);
 weight=A.weight;
 rost=A.rost;
}


footballer::~footballer()
{
    delete[]surname;
    delete[]team;
}

footballer & footballer ::operator=(const footballer &  A)
{
    if (this!=&A)
    {
        /// удалить surname и team, если они были созданы до этого
        surname=new char[strlen(A.surname)+1]; /// это действие только создает массив,
        team=new char[strlen(A.team)+1];        /// но не копирует в него значение(сделать как в конструкторе копий)
        weight=A.weight;
        rost=A.rost;
    }
    return *this;
}

       


void footballer::setrost()
{
    cout<<"\n Enter rost";
    cin>>rost;
}

void footballer::setweight()
{
  cout<<"\n Enter weight";
  cin>>weight;
}

void footballer::print()const
{
  cout<<"footballer:"<<surname<<"rost"<<rost<<"weight"<<weight<<"team"<<team;
}

///////////////////////////////////


attacking::attacking(  unsigned short masteryDef, int golDef, char *nameDef, char *teamDef,float rostDef,float weightDef):footballer(nameDef, teamDef, rostDef, weightDef)
{
    mastery=masteryDef;
    gol=golDef;
}


attacking::attacking(const attacking & A):footballer(A)
{
    mastery=A.mastery;
    gol=A.gol;
}
attacking::~attacking(){}

attacking & attacking:: operator=(const attacking & A)
{
        if (this!=&A)
    {
        mastery=A.mastery;
        gol=A.gol;
    }
    return *this;
}


void attacking::setgol()
{
    gol++;
}

void attacking::print()const
{
    cout<<"footballer:"<<surname<<"mastery"<<mastery<<"gol"<<gol;
}


////////////////////////////////////////
quarterback::quarterback (int matchesDef, int victoryDef, char *nameDef, char *teamDef, float rostDef, float weightDef):footballer(nameDef, teamDef, rostDef, weightDef)
{    matches=matchesDef;
      victory=victoryDef;
}

quarterback::quarterback( const quarterback & A):footballer(A)
{
    matches=A.matches; /// копипаст - зло))
    victory=A.victory;
}

quarterback::~quarterback(){}

quarterback & quarterback::  operator=(const quarterback & A)
{
    if (this!=&A)
    {
        matches=A.matches;/// копипаст - зло))
        victory=A.victory;
    }
    return *this;
}

void quarterback::setmatches() /// названия функций должны совпадать с хидером
{
    matches++;/// копипаст - зло))
}

void quarterback::setvictory()
{
    victory++;
}

void transform( const  attacking &A)
{
    cout<<endl<<"enter mastersto quarterback";
    unsigned short newMastery;
    cin>>newMastery; /// mastery приватный член класса и доступ к нему невозможен.
    /// A.mastery = newMastery; /// надо создать функцию void SetMastery(unsigned short newMastery) в public области и в ней присваивать новое значение
}

Мои комментарии после "///". В этих же строках исправления. Сравнивай со своим кодом.
Этот код компилируется и выполняется, но причесывать там еще очень и очень много)


Часовой пояс GMT +4, время: 02:56.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.