Функция Getter для извлечения 2d-элемента массива, когда 2d-массив является членом данных класса - PullRequest
0 голосов
/ 08 июня 2018

У меня есть 2d массив, который является членом данных класса.Я инициализировал его как false.

. Он находится в своем собственном файле класса .cpp.

Формат:

//constructor
genericClassName::genericClassName(bool)
{

bool genericArray [3][3] = 
{
    { false, false, false },
    { false, false, false },
    { false, false, false },
};

Из моего основного метода я использовалФункция получения в следующем формате:

//creation of an object of the class
genericClassName objectName;

//console output
std::cout << objectName.getterFunction (1, 1) << std::endl;

Числа в () - это аргументы, передаваемые в getterFunction для представления индексов 2d-массива.Строка и столбец в указанном порядке.

Определение getterFunction в файле .cpp класса имеет следующий формат:

bool genericClassName::getterFunction (int row, int column)
{
    return genericArray[row][column];
}

Функция не возвращает 0.Вместо этого я получаю трехзначное число.Я не уверен, что вызов функции неправильный, инициализация массива неправильная, или определение получателя неверно.Создает ли определение локальный массив, который не является массивом, инициализированным как false?

Получатель является открытым.Массив является приватным.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

У вас есть в основном две проблемы:

Задача - 1: Вы объявили массив внутри вашего конструктора, который не инициализирует вашего члена класса.Поэтому, когда вы используете getterFunction(), вы получаете доступ к неинициализированному элементу массива, который дает некоторые значения мусора.

Проблема - 2: Вы упомянули здесь параметризованный конструктор,

//constructor
genericClassName::genericClassName(bool)
{ .... }                          ^^^^^^

и создал экземпляр без передачи параметра

//creation of an object of the class
genericClassName objectName;           // this need a default constructor
                 ^^^^^^^^^^^^  

Если это был весь ваш код, я не думаю, что код скомпилируется, поскольку вы не определили default constructorв вашем коде.


Неуниверсальный способ исправления выглядит следующим образом: СМОТРИТЕ ЗДЕСЬ

class genericClassName
{
private:
   bool genericArray [3][3];  // this has be defined here/ not generic anymore
public:
   genericClassName()
   {
      for (auto &row : genericArray)
         for (auto& ele: row)
            ele = false;
   }
   genericClassName(bool trueOrfalse)  
   {
      for (auto &row : genericArray)
         for (auto& ele: row)
            ele = trueOrfalse;
   }
.............
.............

Чтобы сделать общий 2D-массив, вам необходимоможно использовать std::vector.Это будет выглядеть следующим образом:

СМОТРИТЕ ЖИТЬ ЗДЕСЬ

#include <iostream>
#include <vector>

using Type2D = std::vector< std::vector<bool> >;

class genericClassName
{
private:
   Type2D genericArray;
public:
   genericClassName()  // defualt constrctor with some random size
      :genericArray(3, std::vector<bool>(3, false))
      {}
   genericClassName(bool trueOrfalse, int size)  // use initilizer list here
      :genericArray(size, std::vector<bool>(size, trueOrfalse))
      {}


   bool getterFunction (int row, int column)
   {   return genericArray[row][column];     }

   // just to print all elements
   friend std::ostream& operator<<(std::ostream& out, const genericClassName& obj);
 };
std::ostream& operator<<(std::ostream& out, const genericClassName& obj)
{
   for (const auto &row : obj.genericArray)
      for (const auto& ele: row)
         out << ele << " ";
   return out;
}
 int main(void)
 {
   genericClassName objectName2;  // works with default constrctor
   std::cout << objectName2.getterFunction(1, 1) << std::endl;
   std::cout << objectName2 << std::endl;

   genericClassName objectName(true, 4); // specify the size of your 2D array as well
   std::cout << objectName.getterFunction(1, 1) << std::endl;
   std::cout << objectName << std::endl;

   return 0;
 }
0 голосов
/ 08 июня 2018

Вот рабочий код.Проблема в присвоении значений bool массиву 2 dim в конструкторе.

#include <iostream>
#include <cstdlib>

using namespace std;

class genericClassName{
    bool genericArray [3][3];
    public:
            genericClassName()
            {
                    int i, j;
                    for( i=0;i<3;i++)
                            for(j=0;j<3;j++)
                                    genericArray[i][i] = false;
            }
            bool getterFunction (int row, int column)
            {
                return genericArray[row][column];
            }
 };

 int
 main(void)
 {
    genericClassName objectName;

    cout << objectName.getterFunction (1, 1) << endl;
    return 0;
 }
...