C ++ OOP Класс для вектора векторов - PullRequest
0 голосов
/ 02 апреля 2020

Я совершенно новичок в концепции OOP и хочу создать универсальный c класс Board , который может создавать несколько различных объектов матриц.

Вот мой текущий код:

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int> >board;

void setup(int board_size) {
    // fill inner vector
    for (int i = 0; i < board_size; i++) {
        vector<int>temp;
        for (int j = 0; j < board_size; j++) {
            temp.push_back(1);
        }
        board.push_back(temp);
    }
}

void display() {
    for (int i = 0; i < board.size(); i++) {
        for (int j = 0; j < board[i].size(); j++) {
            cout << board[i][j];
        }
    cout << endl;
    }
}
int main()
{
    setup(3);
    setup(5);
    display();

    return 0;
}

Я хочу улучшить свой код OOP способом, чтобы у меня был класс Board , который можно создать несколько разных матриц с помощью функции setup .

И позже я могу отобразить каждую матрицу с помощью функции display .

Например, :

Board board_1;
Board board_2;

board_1.display();
board_2.display();

Я не совсем уверен, как этого добиться, любая помощь будет очень признательна. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Вы почти на месте, все, что вам нужно сделать, это обернуть класс вокруг кода, который у вас уже есть:

#include <iostream>
#include <vector>
using namespace std;
class Board {
vector<vector<int> >board;
public:
Board(int board_size) {//constructor as per suggestion
  setup(board_size);
}

void setup(int board_size) {//setup now also allows you to change the board-size later
    board.clear();//removing existing elements
    // fill inner vector
    for (int i = 0; i < board_size; i++) {
        vector<int>temp;
        for (int j = 0; j < board_size; j++) {
            temp.push_back(1);
        }
        board.push_back(temp);
    }
}

void display() {
    for (int i = 0; i < board.size(); i++) {
        for (int j = 0; j < board[i].size(); j++) {
            cout << board[i][j];
        }
    cout << endl;
    }
}
};

И это все. Теперь вы можете назвать это так:

Board board_1 = Board(3);
Board board_2 = Board(5);


board_1.display();
board_2.display();

//change board-size and display them again
board_1.setup(6);
board_2.setup(10);


board_1.display();
board_2.display();

Также, возможно, отделить объявление (в .hpp-файле) от реализации (в. cpp -файле)

1 голос
/ 02 апреля 2020

У меня есть несколько предложений относительно вашего кода:

  1. Использование std::vector означает, что размер доски может изменяться во время выполнения, что не должно быть правдой (в большинстве игр ...) , Чтобы создать доску с фиксированным размером, но которую можно инициализировать в разных размерах (то есть вы выбираете размер один раз, и он не может измениться), вы можете использовать std::array с шаблоном класса, который определяется во время компиляции, и не может быть изменено!
  2. Ваша функция установки на самом деле является конструктором класса Board, поэтому вместо создания доски, использующей ее, сделайте ее конструктором по умолчанию.

Look в следующем примере с примерами использования:

#include <array>
#include <iostream>
#include <stdint.h>

template <uint64_t SIZE>
class Board
{
public:
    Board()
    {
        // Here you initialize the board
        for (uint64_t i = 0; i < SIZE; ++i)
        {
            for (uint64_t j = 0; j < SIZE; ++j)
            {
                board_rep[i][j] = 1;
            }
        }
    };

    void display() const
    {
        for (uint64_t i = 0; i < SIZE; ++i)
        {
            std::cout << "| ";
            for (uint64_t j = 0; j < SIZE; ++j)
            {
                std::cout << board_rep[i][j] << " |";
            }

            std::cout << std::endl;
        }
    }

private:
    std::array<std::array<int, SIZE>, SIZE> board_rep;
};


int main()
{
    Board<3> small_board{};
    Board<5> big_board{};

    std::cout << "small board:\n\n" << std::endl;
    small_board.display();
    std::cout << "big board:\n\n" << std::endl;
    big_board.display();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...