Невозможно инициализировать указатель вектора с известным размером, который не изменится для полиморфизма - PullRequest
0 голосов
/ 28 мая 2020

Я делаю игру змей и лестниц с наследованием и полиморфизмом. Доска состоит из плиток, которые могут быть обычными, змеевыми или лестничными. Таким образом, у меня есть класс Board с типом переменной Tile (абстрактный класс), который может быть Snake (дочерний класс) или Ladder (дочерний класс). Плата может быть настолько большой, насколько хочет пользователь, по этой причине я использую векторный указатель Tile.

Я хочу инициализировать такой вектор с фиксированным размером, заданным размером платы, но я получаю сообщение об ошибке «function Board::getBoardSize() is not a type name», но я обнаружил, что все на inte rnet, даже мой профессор инициализируют такие векторы, как этот.

ПРИМЕЧАНИЕ: Board создается внутри другого класса (MyGame), в частности, в функции с именем start(), и в основном я просто создаю тип объекта MyGame для вызова функции запуска, чтобы все происходило .

Обновление: раньше в Board не были настроены все переменные для его построения, но теперь они есть (пришлось перемещать функции между классами и переменными).

Теперь вопрос как мне увеличить размер вектора с помощью указателей плитки? Как было указано, мне нужно увеличить его размер в конструкторе Board после того, как станет известен BoardSize, но каков синтаксис для этого? Есть ли необходимость в push_back (новая плитка *)? или просто push_back ()?

Board.h:

#ifndef BOARD_H
#define BOARD_H
#include <vector>
#include "Tile.h"

class Board
{
    public:
        Board();
        ~Board();
        void setBoardSize();
        void setNumSnakes();
        void setNumLadders();
        void setReward();
        void setPenalty();
        int getBoardSize();
        int getNumSnakes();
        int getNumLadders();
        int getReward();
        int getPenalty();

    public:
        int boardSize;
        int numSnakes;
        int numLadders;
        int reward;
        int penalty;
        std::vector<Tile*> place;
};

#endif

Board. cpp:

#include <stdlib.h>
#include <time.h>
#include <iostream>
#include "Board.h"
#include "Snake.h"
#include "Ladder.h"

Board::Board()
{
    setBoardSize();
    setNumSnakes();
    setNumLadders();       //Now it has all it needs to construct
    setReward();
    setPenalty();

    place.reserve(getBoardSize());  // <------------ I think is something like this.
    for(int i = 0; i < getBoardSize(); i++)
        place.push_back();


    //initialize random seed to randomize snakes and ladders.
    srand(time(NULL));

    int index = rand() % getBoardSize() + 1;

    // All tiles are set to 'N' when the array of Tiles is created.

    //Creates (numSnakes value) Snake objets inside the vector Tile pointer in random indexes.
    for(int i = 0; i < getNumSnakes(); i++)
    {
        /*
            Makes sure it only replaces tiles when:
            - with type = 'N'
            - there is no 'S' tiles before tile 4.
            - there is no 'S' (penlaty value) tiles before the end.
        */
        while (index < getPenalty() || index > (getBoardSize() - getPenalty()) || place[index]->getType() != 'N')
            index = rand() % boardSize + 1;

        place[index] = new Snake(getPenalty());
    }

    index = rand() % getBoardSize() + 1;

    //Creates (numLadders value) Ladder objets inside the vector Tile pointer in random indexes.
    for(int i = 0; i < getNumLadders(); i++)
    {
        /*
            Makes sure it only replaces tiles when:
                - with type = 'N'.
                - there is no 'L' tiles before tile 4.
                - there is no 'L' (reward value) tiles before the end.
        */
        while (index < getReward() || index > (getBoardSize() - getReward()) || place[index]->getType() != 'N')
            index = rand() % boardSize + 1;

        place[index] = new Ladder(getReward());
    }
}

Board::~Board()
{

}

void Board::setBoardSize()
{
    int bz;

    std::cout << "Board size: ";
    std::cin >> bz;
    while (bz < 6);
    {
        std::cout << "Board size cannot be less than 6 " << std::endl << std::endl;
        std::cout << "Board size: ";
        std::cin >> bz;
    }

    boardSize = bz;
}

void Board::setNumSnakes()
{
    int numS;

    std::cout << "Number of Snake tiles: ";
    std::cin >> numS;

    if(numS >= 0)
        numSnakes = numS;
    else
        numSnakes = -numS;
}

void Board::setNumLadders()
{
    int numL;

    std::cout << "Number of ladder tiles: ";
    std::cin >> numL;

    if(numL >= 0)
        numLadders = numL;
    else
        numLadders = -numL;
}

void Board::setReward()
{
    int rew;

    std::cout << "Reward (Ladder's consequence): ";
    std::cin >> rew;
    while (rew == 0);
    {
        std::cout << "The reward cannot be zero." << std::endl << std::endl;
        std::cout << "Reward (Ladder's consequence): ";
        std::cin >> rew;
    }

    if(rew > 0)
        reward =  rew;
    else
        reward  = (rew * -1);
}

void Board::setPenalty()
{
    int pen;

    std::cout << "Penalty (Snake's consequence): ";
    std::cin >> pen;
    while (pen == 0);
    {
        std::cout << "The penalty cannot be zero." << std::endl << std::endl;
        std::cout << "Penalty (Snake's consequence): ";
        std::cin >> pen;
    }

    if(pen < 0)
        penalty =  pen;
    else 
        penalty  = (penalty * -1);


}

int Board::getBoardSize()
{
    return boardSize;
}

int Board::getNumSnakes()
{
    return numSnakes;
}

int Board::getNumLadders()
{
    return numSnakes;
}

int Board::getReward()
{
    return reward;
}

int Board::getPenalty()
{
    return penalty;
}

MyGame.h:

#ifndef MYGAME_H
#define MYGAME_H

class MyGame
{

    protected:
        int numPlayers;
        int maxTurns;

    public:
        MyGame();
        ~MyGame();
        void start();
        void setNumPlayers(int);
        void setMaxTurns(int);
        int getNumPlayers();
        int getMaxTurns();
};

#endif

MyGame. cpp:

#include <iostream>
#include "MyGame.h"
#include "Board.h"

MyGame::MyGame()
{

}

MyGame::~MyGame()
{

}

void MyGame::start()
{
    /*
    std::cout << "Number of player: ";
    std::cin >> numPlayers;
    std::cout << std::endl;

    std::cout << "Maximum number of turns: ";
    std::cin >> maxTurns;
    std::cout << std::endl;

    int r = setReward();
    int p = setPenalty();
    */
    numPlayers = 2;
    maxTurns = 20;

    Board brd();

    //Prints Tile's type (debugging)
    for(int i = 0; i < brd.getBoardSize(); i++)
        std::cout << i + 1 << brd.place[i]->getType() << std::endl;


}

void MyGame::setNumPlayers(int numP)
{
    if(numP > 1)
        numPlayers = numP;
    else
    {
        std::cout << "The number of players isn't enough to start." << std::endl;
        numPlayers = 0;
    }

}

void MyGame::setMaxTurns(int max)
{
    if(max > 0)
        maxTurns = max;
    else
    {
        std::cout << "The Limit  of turns has to be higger than 0" << std::endl;
        maxTurns = 0;
    }
}

int MyGame::getNumPlayers()
{
    return numPlayers;
}

int MyGame::getMaxTurns()
{
    return maxTurns;
}

main. cpp:

#include <iostream>
#include "MyGame.h"

using namespace std;

int main()
{
    MyGame snakes;

    snakes.start();
    cin.get();
}

1 Ответ

2 голосов
/ 28 мая 2020

Так что, похоже, есть две ошибки, первая чисто техническая. Способ написать код, который вы пытаетесь написать, - это создать плату в вашем списке инициализаторов конструктора, например,

Board::Board(int rwrd, int pnlty) : place (getBoardSize())
{
    ...
}

Но вторая проблема кажется более серьезной. Я не вижу в вашем коде ничего, что указывало бы на то, что вы знаете размер доски при создании объекта Board. В опубликованном вами коде размер платы становится известен только после вызова метода setBoardSize, чего, насколько я понимаю, никогда не происходит.

Вероятно, вам следует сделать размер платы параметром вашего конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...