c ++中没有参数的数组

时间:2015-01-15 23:43:58

标签: c++

我在c ++中很新,虽然在java中有点经验,但我的问题是下一个:

我正在做一个数独项目,我正在创建一个抽象数据类型的盒子和棋盘。在第一个板块中,我创建了一个biimesional数组的盒子,但是当我想将它创建为公共数据时,我可以在整个类中使用它,而不仅仅是在板构造函数中。

我在电路板构造函数中创建它因为如果我不在那里创建它,我无法知道每个维度的值,如果我创建变量Box box[int][int]我可以在课堂上使用它,我无法知道尺寸。使用某些代码可以更好地理解它。

这段代码允许我创建具有我想要的尺寸的Box数组,因为它在电路板构造函数中比创建它时具有参数盒子的数量,但它不是&# 39;让我使用" casilla"类的其他部分中的变量或其他类:

class tablero{

    int filas;
    int columnas;

public:


    tablero (int filas, int columnas){

    this->filas = filas;

    this->columnas =columnas;
    Casilla casilla[filas][columnas];


    }
    Casilla getCasilla(int n, int m){
        return casilla[n][m];  <- Here shows an error because casilla cannot be resolved.

    }

这个其他代码让我使用了casilla变量,但是在我知道之前我必须先给它维度参数:

class tablero{

    int filas;
    int columnas;

public:
    Casilla casilla[0][0];

    tablero (int filas, int columnas){

    this->filas = filas;

    this->columnas =columnas;



    }
    Casilla getCasilla(int n, int m){
        return casilla[n][m];

    }

没有错误,但卡西利亚阵列的尺寸必须在我知道它们之前给出,因此,它们可能是错误的(因为电路板可能有不同的尺寸。

这是我第一次使用c ++进行编程,而且我对此问题感到非常沮丧,有没有人可以帮助我找到一种方法来实现它,以便它可以双向工作? (我已经尝试将两个维度都留空,然后在构造函数中放置casilla[][] = Casilla cas[filas] [columnas]但是它给了我一个错误..)

感谢大家的帮助。此外,如果你认为标题不够清晰,你可以建议一个,我会改变它。

Casilla代码就是这个:

类Casilla {

int fila;

int columna;

int numero;

   public:

      // constructor

      Casilla(int fila, int columna,int numero)
      {
          this->fila = fila;

          this->columna = columna;

          this->numero = numero;


      }

};

感谢大家的回答,我已经从3个不同的人那里找到了我需要的答案。我无法支持你们所有人,因为我仍然没有15点声望,但是当我拥有它时,我会全力支持你们。真的,谢谢你的所有答案。我只需要知道我对选中的答案所评论的内容,它就会全部回答。

4 个答案:

答案 0 :(得分:2)

C风格的数组维度必须在C ++的编译时知道。因此,没有Casilla casilla[filas][columnas];的变体可以使用。

相反,您应该使用一个容器,它可以容纳您想要放入其中的数据。不鼓励在C ++中使用C风格的数组,因为它们有一些奇怪的行为和规则,它们主要用于向后兼容。

最简单的选项是具有运行时大小的一维数组,称为vector

class tablero{

    int filas;
    int columnas;
    std::vector<Casilla> casilla;

public:
    tablero (int filas, int columnas)
        : filas(filas), columnas(columnas), casilla(filas * columnas)
    { }

    Casilla getCasilla(int f, int c) const
    {
        return casilla[f * columnas + c]; 
    }
};

请注意构造函数初始化列表的使用。您应该以这种方式为类成员提供初始值,而不是在构造函数中使用赋值语句。

答案 1 :(得分:2)

带阵列的解决方案

//----------------------------------------------------------------------------
#include <iostream>
#include <iomanip>
//----------------------------------------------------------------------------
class Casilla
{
    int fila;
    int columna;
    int numero;

   public:

      // default constructor
      Casilla()
      {
          this->fila = -1;
          this->columna = -1;
          this->numero = 0;
      }

      int GetNumero() {return numero;}  
      void SetCasilla (int _fila, int _columna) //set a cell position
      {
          fila = _fila;
          columna = _columna;
      }
      void SetCasilla (int _numero)             //set a cell value
      {
          numero = _numero;
      }
      void SetCasilla (int _fila, int _columna, int _numero) //set a cell position and value
      {
          fila = _fila;
          columna = _columna;
          numero = _numero;
      }

};

class Tablero
{
    int filas;
    int columnas;
    Casilla **casilla;

public:

    Tablero (int filas, int columnas)
    {
        this->filas = filas;
        this->columnas =columnas;
        casilla = new Casilla* [filas];
        for (int i = 0; i<filas; i++)
          casilla[i] = new Casilla [columnas];

        for (int i = 0; i<filas; i++)
            for (int j = 0; j<columnas; j++)
                casilla[i][j].SetCasilla(i,j);  //set the right position for each cell
                                                //the values = 0 by default
    }

    //destructor
    ~Tablero()
    {
        for (int i = 0; i<filas; i++)
            delete [] casilla[i];
        delete [] casilla;
    }

    //set a cell value in the table 
    void ChangeCasillaValue (int _fila, int _columna, int _numero)
    {
        casilla[_fila][_columna].SetCasilla (_numero);
    }


    Casilla getCasilla(int n, int m)
    {
        return casilla[n][m]; 
    }

    void PrintTablero ()
    {
         for (int i = 0; i<filas; i++)
        {     
            for (int j = 0; j<columnas; j++)
                  std::cout << std::setw(5)<<casilla[i][j].GetNumero();
            std::cout << "\n";
         }
         std::cout << "\n";
    }
};


//----------------------------------------------------------------------------
int main()
{   
    int N = 5, M = 6;
    Tablero table(N, M);
    table.PrintTablero();

    table.ChangeCasillaValue(1,1,-5); //change value in cell(1,1)
    table.PrintTablero();

    std::cin.get();
    return 0;
}
//-----------------------------------------------------------------------------

你必须自己添加一堆setter和getter。 但是,作为草案,它有效。

答案 2 :(得分:1)

在第一个示例中,在构造函数中,行

Casilla casilla[filas][columnas];

声明casilla构造函数本地的Casilla个数组数组。构造函数返回后,casilla超出范围。您的casilla函数中没有getCasilla成员变量或局部变量,因此无法解析。

在第二个示例中,您的类有一个公共成员casilla被声明为0 {0}个Casilla对象数组。您的getCasilla函数将返回0 x数组的第n行和第m列中的项。在C ++中,没有绑定检查数组解除引用,因此这会返回一些超出范围的内存位置并且非常糟糕。

您可以使用mallocfree自行创建动态C数组,但由于您使用的是C ++,因此使用std::vector会更容易。

例如,您可以使用:

#include <iostream>
#include <vector>

class Casilla
{};

class tablero
{
  int filas_;
  int columnas_;
  std::vector<std::vector<Casilla> > casilla_; // a vector of vectors of Casillas
public:
  tablero(int filas, int columnas) : filas_(filas), columnas_(columnas), 
                                     casilla_(filas, std::vector<Casilla>(columnas))
  // The above is an initialization list
  // We initialize casilla_ as a vector of filas vectors of columnas Casillas
  {}

  std::vector<std::vector<Casilla> > getCasilla() const
  {
    return casilla_;
  }
};


int main(int argc, const char* argv[])
{
  tablero t(3, 3);

  std::cout << "casilla rows: " << t.getCasilla().size() << std::endl;
  std::cout << "casilla cols: " << t.getCasilla()[0].size() << std::endl;

  return 0;
}

答案 3 :(得分:0)

First Casilla casilla[filas][columnas];需要是一个类变量,因此所有方法都可以访问它 其次,行和列的大小必须是固定数字,例如Casilla casilla[9][9];
如果需要动态分配,你可以使用矢量矢量或矢量矢量 如果它是2d数组,您仍然可以将其创建为1d数组,但取决于哪个最适合您的目的。