4 / 4 / 3
Регистрация: 13.01.2013
Сообщений: 142
1

Производные классы

24.04.2015, 16:02. Показов 1105. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Столкнулся со следующей проблемой: в main создается матрица типа Basic (производный абстрактный класс для наследования классов Virus и Antivirus), проблема следующая, матрица объявлена как public, но в производных классах ( в частности класс Virus ) её не видно. Привожу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Virus.h"
#include "AntiV.h"
 
using namespace std;
 
Basic *field[36][23];
 
void drawfield(){
    setcolor(8);
    rectangle(5, 5, 905, 580);
    for(int i = 30; i < 595;){
        line(5, i, 905, i);
        i += 25;
    }
    for(int i = 30; i < 905;){
        line(i, 5, i, 580);
        i += 25;
    }
    setcolor(14);
    line(930, 0, 930, 585);
}
...
Класс Virus:
C++
1
2
3
4
5
6
7
8
9
10
11
int Virus :: CanCapture(){
    if(field[x_matr][y_matr - 1] != 0){
        if(field[x_matr][y_matr - 1]->getType() == 'v'){
            if(field[x_matr + 1][y_matr] == 0)||
                (field[x_matr][y_matr + 1] == 0)||
                (field[x_matr - 1][y_matr] == 0){
                    return (x_matr * 100) + y_matr;
            }
        }
    }
...
в последнем куске кода выдает 'field' was not declared in this scope.
Подскажите как сделать так чтобы эту матрицу было видно в производных классах.
P.S. при написании функций в классе Virus отображается field и соответственно тип Basic*.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2015, 16:02
Ответы с готовыми решениями:

Наследование, базовые классы и производные классы
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.)
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы...

производные классы.
Попалось такое Задание: Написать программу используя базовый и производный классы, защищенные члены...

производные классы
Задание: Разработайте программу на языке С++, использующую наследование. Вариант 18. Создайте...

3
2270 / 1762 / 740
Регистрация: 27.07.2012
Сообщений: 5,237
24.04.2015, 16:20 2
Ничего не понятно. Приведи код класса Basic.
0
4 / 4 / 3
Регистрация: 13.01.2013
Сообщений: 142
24.04.2015, 18:38  [ТС] 3
Код класса Basic.
H-файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef Basic_h
#define Basic_h
#include "graphics.h"
#include <iostream>
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <ctime>
 
class Basic{
    protected:
        int life_time;
        int x_matr, y_matr;
        char type;
        int color;
 
    public:
        Basic();
        Basic(int x_coord, int y_coord);
        virtual ~Basic();
 
        int getLife();
        char getType();
        int getX();
        int getY();
 
        void setLife(int life);
        void setType(char type);
        void setX(int x_matr);
        void setY(int y_matr);
 
        void virtual Show() = 0;
        void virtual Hide() = 0;
 
        int virtual CanCapture() = 0;
        void virtual Capture(int x, int y) = 0;
};
#endif
CPP-файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "Basic.h"
 
Basic :: Basic(){
    this->type = 'n';
    this->life_time = 1;
    this->x_matr = 0;
    this->y_matr = 0;
}
 
Basic :: Basic(int x, int y){
    this->type = 'n';
    this->life_time = 1;
    this->x_matr = x;
    this->y_matr = y;
}
 
Basic :: ~Basic(){
 
}
 
int Basic :: getLife(){
    return life_time;
}
 
char Basic :: getType(){
    return type;
}
 
int Basic :: getX(){
    return x_matr;
}
 
int Basic :: getY(){
    return y_matr;
}
 
void Basic :: setLife(int life){
    life_time = life;
}
 
void Basic :: setType(char type){
    this->type = type;
}
 
void Basic :: setX(int x){
    x_matr = x;
}
 
void Basic :: setY(int y){
    y_matr = y;
}
Код класса Virus
H-файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Basic.h"
 
class Virus : public Basic{
 
    public:
        Virus();
        Virus(int x_matr, int y_matr);
        ~Virus();
 
        void virtual Show();
        void virtual Hide();
 
        int virtual CanCapture();
        void virtual Capture(int x, int y);
};
CPP-файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef Virus_h
#define Virus_h
#include "Virus.h"
 
Virus :: Virus() : Basic(){
    this->type = 'v';
    this->color = 4;
}
 
Virus :: Virus(int x_matr, int  y_matr) : Basic(x_matr, y_matr){
    this->type = 'v';
    this->color = 4;
}
 
Virus :: ~Virus(){
}
 
void Virus :: Show(){
    setfillstyle(1, color);
    bar((x_matr * 25) + 6, (y_matr * 25) + 6, (x_matr * 25) + 30, (y_matr * 25) + 30);
}
 
void Virus :: Hide(){
    setfillstyle(1, 0);
    bar((x_matr * 25) + 6, (y_matr * 25) + 6, (x_matr * 25) + 30, (y_matr * 25) + 30);
}
 
int Virus :: CanCapture(){
    if(field[x_matr][y_matr - 1] != 0){
        if(field[x_matr][y_matr - 1]->getType() == 'v'){
            if(field[x_matr + 1][y_matr] == 0)||
                (field[x_matr][y_matr + 1] == 0)||
                (field[x_matr - 1][y_matr] == 0){
                    return (x_matr * 100) + y_matr;
            }
        }
    }
    if(field[x_matr + 1][y_matr] != 0){
        if(field[x_matr + 1][y_matr]->getType() == 'v'){
            if(field[x_matr][y_matr - 1] == 0)||
                (field[x_matr][y_matr + 1] == 0)||
                (field[x_matr - 1][y_matr] == 0){
                    return (x_matr * 100) + y_matr;
            }
        }
    }
    if(field[x_matr][y_matr + 1] != 0){
        if(field[x_matr][y_matr + 1]->getType() == 'v'){
            if(field[x_matr][y_matr - 1] == 0)||
                (field[x_matr + 1][y_matr] == 0)||
                (field[x_matr - 1][y_matr] == 0){
                    return (x_matr * 100) + y_matr;
            }
        }
    }
    if(field[x_matr - 1][y_matr] != 0){
        if(field[x_matr - 1][y_matr]->getType() == 'v'){
            if(field[x_matr][y_matr - 1] == 0)||
                (field[x_matr][y_matr + 1] == 0)||
                (field[x_matr + 1][y_matr] == 0){
                    return (x_matr * 100) + y_matr;
            }
        }
    }
    return 0;
}
 
void Virus :: Capture(int x, int y){
    Basic *p = new Virus(x, y);
    field[x][y] = p;
    field[x][y]->Show();
}
 
}
#endif // Virus_h
файл main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "Virus.h"
#include "AntiV.h"
 
using namespace std;
 
Basic *field[36][23];
 
void drawfield(){
    setcolor(8);
    rectangle(5, 5, 905, 580);
    for(int i = 30; i < 595;){
        line(5, i, 905, i);
        i += 25;
    }
    for(int i = 30; i < 905;){
        line(i, 5, i, 580);
        i += 25;
    }
    setcolor(14);
    line(930, 0, 930, 585);
}
 
void loadinfo(){
    setcolor(15);
    outtextxy(955, 25, "Информация о проекте:");
    setfillstyle(1, 4);
    rectangle(975, 55, 1000, 80);
    bar(975, 55, 1000, 80);
    outtextxy(1010, 60, " - Вирус");
    setfillstyle(1, 2);
    rectangle(975, 105, 1000, 130);
    bar(975, 105, 1000, 130);
    outtextxy(1010, 110, " - Антивирус");
}
 
void initialize(){
    initwindow(1200, 585);
    drawfield();
    loadinfo();
}
 
void preparebasic(){
    srand(time(NULL));
    Basic *ptr;
    int n, m;
    for(int i = 0; i < 5; i++){
        n = rand() % 36;
        m = rand() % 23;
        ptr = new Virus(n, m);
        field[n][m] = ptr;
        field[n][m] -> Show();
        if( i % 2 == 0){
                if(m + 1 < 23){
                    ptr = new Virus(n, m + 1);
                    field[n][m + 1] = ptr;
                    field[n][m + 1] -> Show();
                }else{
                    ptr = new Virus(n, m - 1);
                    field[n][m - 1] = ptr;
                    field[n][m - 1] -> Show();
                }
        }
    }
    for(int i = 0; i < 5; i++){
        n = rand() % 36;
        m = rand() % 23;
        ptr = new AntiV(n, m);
        field[n][m] = ptr;
        field[n][m] -> Show();
        if( i % 2 == 0){
                if(m + 1 < 23){
                    ptr = new AntiV(n, m + 1);
                    field[n][m + 1] = ptr;
                    field[n][m + 1] -> Show();
                }else{
                    ptr = new AntiV(n, m - 1);
                    field[n][m - 1] = ptr;
                    field[n][m - 1] -> Show();
                }
        }
    }
}
 
void startlife(){
    int temp = 0;
    for(int i = 0; i < 36; i++){
        for(int j = 0; j < 23; j++){
            if(field[i][j] != 0){
                if(field[i][j]->getType() == 'v'){
                    temp = field[i][j]->CanCapture();
                    if(temp != 0){
                        field[i][j]->Capture(temp / 100, temp % 100);
                    }
                }
            }
        }
    }
}
 
int main()
{
    initialize();
    preparebasic();
    startlife();
    cin.get();
    closegraph();
    return 0;
}
Само задание таково :
Создать систему классов с использованием всех основных свойств классов (наследование, виртуальность, деструкторы, конструкторы, перегрузка функций, и т.д.) для описания следующей задачи: Дано прямоугольное поле жизненного пространства. На нем имеются начальные очаги вируса, размножающегося по следующим правилам за 1 единицу времени:
• если вирус не имеет соседей, он не размножается, и если остается в таком состоянии в течение 10 единиц времени, то погибает;
• если рядом находятся 2 вируса (диагональное соседство не учитывать), то они могут захватить пустое поле (размножиться);
• если рядом находятся 3 вируса, то они могут захватить 1 пустое поле или 1 поле с антивирусом. Антивирус живет по тем же правилам, только размноженное новое поле он может (если есть необходимость) поставить в любое свободное со всех сторон поле;
• если соседей больше, то действия можно осуществлять по необходимости за 1 момент времени (например, 4 клетки с вирусом: это или 2 по 2, или 3 плюс одна простаивающая).
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
24.04.2015, 22:04 4
Цитата Сообщение от VadiMaid Посмотреть сообщение
проблема следующая, матрица объявлена как public, но в производных классах ( в частности класс Virus ) её не видно.
Как ее будет видно, если она объявлена после "производных классов"? Засуньте в Basic "static Basic *field[36][23];", а в main напишите Basic *Basic::field[36][23];, должно помочь.
1
24.04.2015, 22:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2015, 22:04
Помогаю со студенческими работами здесь

Абстрактные и производные классы
Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

Создать производные классы
Создать производные классы со своими методами вывода информации на экран (абстрактного класса...

Указатели на производные классы
Подскажите, как создать массив типа &quot;указатель на базовый класс&quot;, который будет содержать указатель...

Абстрактные и производные классы С++
Проблема: Есть базовый класс &quot;Фигура&quot;, и производные: &quot;Точка&quot;, &quot;Круг&quot;, &quot;Прямоугольник&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru