繁体   English   中英

当二维数组是类的数据成员时,Getter函数可检索二维数组元素

[英]Getter function to retrieve a 2d array element when the 2d array is a data member of a class

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

它在自己的.cpp类文件中。

格式为:

//constructor
genericClassName::genericClassName(bool)
{

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

在我的主要方法中,我使用了以下格式的getter函数:

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

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

()中的数字是传递给getterFunction的参数,以表示2d数组的下标。 行和列的顺序。

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

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

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

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

您主要有两个问题:

问题-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;
 }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM