当2d数组是类的数据成员时,Getter函数检索2d数组元素

时间:2018-06-08 06:04:42

标签: c++ class c++11 multidimensional-array generic-programming

我有一个2d数组,它是类的数据成员。我将其初始化为false

它位于自己的.cpp类文件中。

格式为:

//constructor
genericClassName::genericClassName(bool)
{

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

从我的main方法开始,我使用了以下格式的getter函数:

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

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

()中的数字是传递给getterFunction的参数,用于表示二维数组的下标。按行顺序排列。

类.cpp文件中的getterFunction定义采用以下格式:

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

该功能未返回0。相反,我得到一个三位数字。我不确定函数调用是否错误,数组的初始化是错误的,或者getter的定义是错误的。定义是否创建了一个不是数组初始化为false的本地数组?

吸气剂是公开的。该数组是私有的。

2 个答案:

答案 0 :(得分:1)

你主要有两个问题:

问题 - 1:您已在构造函数中声明了一个数组,这样就不会初始化您的类成员。因此,当您使用getterFunction()时,您正在访问未初始化的数组元素,这会产生一些垃圾值。

问题 - 2:您在此处提到过参数化构造函数,

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

并在不传递参数的情况下创建实例

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

如果这是您的所有代码,我不认为,代码将编译,因为您没有在代码中定义任何default constructor

非一般的修复方法如下:SEE HERE

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。这将如下所示:

SEE LIVE HERE

#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;
 }

答案 1 :(得分:0)

这是工作代码。    问题是在构造函数中将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;
 }