Не работает функция ООП с++

Есть космос представляющий собой матрицу, а также корабли пришельцев квадрат 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 шт):

Автор решения: DmitryK

Поскольку все классы наследуются от 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);

Наследование используется при расширении функционала класса. А как пришелец расширяет космос? Или космонавт? В Вашем примере космос "содержит" пришельцев. А космонавт просто делает какие-то операции с/в космосом.
Т.е. тут не наследование должно быть по логике, а например космос может содержать массив объектов пришелец. А космонавт может хранить в себе указатель на тот космос, в котором он находится. Или надо передавать указатель/ссылку на космос в функции космонавта.

→ Ссылка
Автор решения: DmitryK

Делать геттеры/сеттеры. Либо располагать массив в секции 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);
→ Ссылка