Не работает функция ООП с++
Есть космос представляющий собой матрицу, а также корабли пришельцев квадрат 2x2 состоящий из единиц и прямоугольник 3x1 состоящий из 2.Задача функции скан обнаружить корабли и вывести сообщение об обнаружении, но она почему-то не работает, не могу понять почему и как это исправить.
#include <iostream>
using namespace std;
class kosmos {
protected: int A[10][10];
public:
kosmos() {
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++) {
A[i][j] = 0;
}
}
};
void put(int i, int j, int z);
void vivod() {
for (int z = 0; z < 10; z++)
{
for (int x = 0; x < 10; x++) {
cout << A[z][x] << " ";
}
cout << endl;
}
}
};
void kosmos::put(int i, int j, int z) {
A[i][j] = z;
}
class kosmonavt : kosmos {
protected: int ksti = 0; int mouse = 0;
public:
void expiriment();
int skan(int i, int j, int z);
};
void kosmonavt::expiriment() {
ksti += 1;
mouse += 5;
if (20 > mouse || mouse > 2000) {
cout << "Мышь погибла";
}
}
int kosmonavt::skan(int i, int j, int z) {
for (i; i < z; i++) {
for (j; j < z; j++)
if (A[i][j] != 0) { cout << "Вижу НЛО " << endl; return 1; }
}
};
class prishelci : public kosmos {
public:
void alfa(kosmos* x, int h, int w, int z) { { x->put(h, w, z); x->put(h + 1, w, z); x->put(h, w + 1, z); x->put(h + 1, w + 1, z); return; } }
void beta(kosmos* x, int h, int w, int z) { { x->put(h, w, z); x->put(h, w + 1, z); x->put(h, w + 2, z); return; } }
};
int main()
{
setlocale(LC_ALL, "Rus");
kosmonavt ksm; kosmos V; prishelci pr;
pr.alfa(&V, 6, 6, 1);
pr.beta(&V, 2, 2, 2);
V.vivod();
ksm.skan(0, 0, 4);
}
Ответы (2 шт):
Поскольку все классы наследуются от kosmos, при создании объектов создается 3 космоса.
// здесь создается 3 космоса
kosmonavt ksm; // один внутри космонавта
kosmos V; // второй
prishelci pr; // третий внутри пришельца
Дальше в объект prishelci pr, у которого есть собственный космос, передается адрес космоса V, и в него заполняются данные и даже вывод делается:
pr.alfa(&V, 6, 6, 1);
pr.beta(&V, 2, 2, 2);
V.vivod();
А затем, в космосе, который находится внутри объекта космонавт kosmonavt ksm осуществляется поиск. Но только данных в нем нет, потому что заполнялся космос V, а не космос внутри ksm
ksm.skan(0, 0, 4);
Наследование используется при расширении функционала класса. А как пришелец расширяет космос? Или космонавт? В Вашем примере космос "содержит" пришельцев. А космонавт просто делает какие-то операции с/в космосом.
Т.е. тут не наследование должно быть по логике, а например космос может содержать массив объектов пришелец. А космонавт может хранить в себе указатель на тот космос, в котором он находится. Или надо передавать указатель/ссылку на космос в функции космонавта.
Делать геттеры/сеттеры.
Либо располагать массив в секции public или вернуть указатель на начало массива и работать напрямую с памятью. Но тогда зачем было массив инкапсулировать?
class kosmos
{
const size_t h_size = 10; // количество строк
const size_t v_size = 10; // количество столбцов
int A[10][10];
public:
kosmos();
size_t GetHSize() { return h_size; } // получить количество строк
size_t GetVSize() { return v_size; } // полчить количество столбцов
int* GetMassPtr() { return A[0]; } // указатель на начало массива для прямого доступа - спорное решение!!!
void Set(int i, int j, int z) { A[i][j] = z; } // установить значение элемента
int Get(int i, int j) { return A[i][j]; } // получить значение элемента
void vivod();
}
class kosmonavt
{
public:
void expiriment();
int skan(kosmos& k, int i, int j, int z);
};
int kosmonavt::skan(kosmos& k, int i, int j, int z)
{
if( z < 0 || z > k.GetHSize() ) // поверка на выход за границы массива
return -1;
if( i < 0 || i > k.GetHSize() ) // поверка на выход за границы массива
return -1;
if( j < 0 || j > k.GetVSize() ) // поверка на выход за границы массива
return -1;
for (i; i < z; i++)
for (j; j < z; j++)
if ( k.Get( i, j) != 0 )
{
cout << "Вижу НЛО " << endl;
return 1;
}
};
int main()
{
kosmos V;
kosmonavt ksm;
ksm.skan( V, 0, 0, 4);