Как использовать оператор точки в 2D-векторе моего класса при доступе к функции этого класса? - PullRequest
0 голосов
/ 04 апреля 2020

У меня проблемы с объяснением того, что я пытаюсь сделать - извините, если испортил название: итак, я сделал 2D Вектор. 2D Вектор - это объект моего класса, который называется Matrix. Я попытался сделать matrix.fill2dVector(numRows,numCols), и я получил бы эти ошибки:

class "std::vector<std::vector<Matrix, std::allocator<Matrix>>, std::allocator<std::vector<Matrix, std::allocator<Matrix>>>>" has no member "fill2dVector"

'fill2dVector': is not a member of 'std::vector<std::vector<Matrix,std::allocator<_Ty>>,std::allocator<std::vector<_Ty,std::allocator<_Ty>>>>'

Я вижу, что он пытается найти fill2dVector внутри векторный контейнер STL; но я не хочу этого делать. Кроме того, я застрял с использованием функций в прототипах, так как это задание для моего класса, но мне разрешено изменять их.

#include <iostream>
#include <vector>

class Matrix
{
public:
    Matrix();

    double& operator()(const int rn, const int cn);

    void operator()();

    void fill2dVector(int &numRows, int &numCols);

    void display2dVector(int &numRows, int &numCols) const;

private:
    int numRows = 10, numCols = 10;
    std::vector<std::vector <double>> data;
};

Matrix::Matrix()
{
    data[10][10] = {};
}

double& Matrix::operator()(const int rn, const int cn)
{
    return data[rn][cn];
}

void Matrix::operator()()
{
    for (int r = 0; r < numRows; ++r)
    {
        for (int c = 0; c < numCols; ++c)
        {
            data[r][c] = 0;
        }
    }
}

void Matrix::display2dVector(int &numRows, int &numCols) const
{
    for (int r = 0; r < numRows; ++r)
    {
        for (int c = 0; c < numCols; ++c)
        {
            std::cout << "   " << data[r][c] << " ";
        }
        std::cout << std::endl;
    }
}

void Matrix::fill2dVector(int &numRows, int &numCols)
{
    for (int r = 0; r < numRows; ++r)
    {
        std::cout << "Enter " << numCols << " values for row #" << r << std::endl;
        for (int c = 0; c < numCols; ++c)
        {
            std::cin >> data[r][c];
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::cout << "Enter the size of the matrix:" << std::endl;

    std::cout << "   How many rows? ";
    int numRows;
    std::cin >> numRows;

    std::cout << "How many columns? ";
    int numCols;
    std::cin >> numCols;
    std::cout << std::endl;

    std::cout << "*** numRows = " << numRows << ", " << "numCols = " << numCols << std::endl;

    std::vector< std::vector <Matrix> > matrix;

    std::cout << "Contents of the " << numRows << " x " << numCols << " vector:" << std::endl;
    matrix.fill2dVector(numRows,numCols);
}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Я не уверен на 100%, понимаю ли я ваш вопрос, поэтому я думаю, что предоставляю пример кода для доступа к объекту трехмерного вектора, который я написал некоторое время go, и я думаю, это действительно поможет вам решить ваш вопрос. Просто удалите один слой для доступа к двухмерному вектору.

С этим примером кода вы сможете решить свой вопрос. Есть также <random> пример, относящийся к другому вашему вопросу.

#include <iostream>     // cout
#include <vector>       // vector
#include <random>       //rand, srand
#include <algorithm>    //shuffle
#include <string>       //using strings
#include <limits>       //cin

using my_engine = std::random_device; //most random


class deck
{
   std::string comment;

public:
   void output(std::string);    //txt output
   void display_card_deck();//display all cards
   void mix_cards();        //delete and remix deck new game

   size_t getCards(size_t playnum, size_t color, size_t number);

private:
   size_t _inp_check();     //input player number + check
   std::vector < std::vector < std::vector < size_t > > > _card_deck;           //assign 3d vector
   void _shuffle_cards(size_t players); //mix and shuffle cards randomly
};


void deck::output(std::string comment)
{
    std::cout << comment  << " cards are used for " << _card_deck.size() << std::endl;

}



int main()
{
    deck play;
    //round 1
    play.mix_cards(); //mix cards randomly and input player number 2-8
    play.output ("Welcome Player ... and Player ... "); //text, number of players

    std::cout << play.getCards(0,2,2) << "test output" << std::endl; //pick one card

    //round 2
    play.mix_cards();
    std::cout << play.getCards(0,2,2) << std::endl; //pick one card

    play.output ("Welcome Player ... and Player ... "); //text, number of players
    play.display_card_deck();

   return 0;
}


//members of deck class

size_t deck :: _inp_check()
{
    size_t input;

    while (!(std::cin >> input) || input < 2 || input > 8)
    {
         std::cin.clear();
         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
         std::cout << "Try again and enter a valid player number from 2 to 8: "<< "\n";
    }

    return input;
}

void deck :: mix_cards()
{
    if (_card_deck.empty())
    {
        std::cout << "How many Players are playing today? (2-8):" << std::endl;
        size_t players = _inp_check();
        _shuffle_cards(players);
    }
    else
    {
        std::cout << "How many Players are playing today? (2-8):" << std::endl;
        _card_deck.clear();
        size_t players = _inp_check();
        _shuffle_cards(players);
    }
}

void deck :: _shuffle_cards(size_t players)
{
    my_engine engn; //random_device

      for(size_t playnum = 0; playnum < players; ++playnum)
      {
            std::vector < std::vector < size_t > > d1;
            _card_deck.push_back( d1 );

            for(size_t color = 0; color < 4; color++)
                {
                std::vector < size_t > d2;
                        _card_deck[playnum].push_back( d2 );

                    for(size_t k = 1; k < 11; k++)
                    {
                        _card_deck[playnum][color].push_back( k ); //1 2 3 4 5 6 7 8 9 10
                    }

                shuffle(_card_deck[playnum][color].begin(), _card_deck[playnum][color].end(), engn);
            }
      }
}

void deck :: display_card_deck()
{
    for (size_t i = 0; i < _card_deck.size(); i++)
    {
        for (size_t j = 0; j < _card_deck[i].size(); j++)
        {
            for (size_t k = 0; k < _card_deck[i][j].size(); k++)
            {
                std::cout << "_card_deck[" << i << "][" << j << "][" << k << "] = " << _card_deck[i][j][k] << std::endl;
            }
        }
    }
}

size_t deck::getCards(size_t playnum, size_t color, size_t number)
{
    return  _card_deck[playnum][color][number];
}

0 голосов
/ 04 апреля 2020

Вместо:

std::vector< std::vector <Matrix> > matrix;

Запись:

Matrix matrix;

Также ваша матричная реализация нарушена, потому что вы получаете доступ к векторным элементам без Выделение и при заполнении не проверяет размер вектора, поэтому вы можете получить доступ за пределами границ, и почему вы передаете эти целые по ссылке?

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