我对c++相当陌生,尽管对Java有一定的经验,但我的问题是下一个:
我正在做一个数独项目,在其中创建盒子和板子的抽象数据类型。在第一个开发板中,我正在创建一个由盒子组成的数组,但是当我想将其创建为公共(public)数据时,可以在整个类中使用它,而不仅是在开发板构造函数中使用。
我要在电路板构造函数中创建它,因为如果不在那里创建它,我将无法知道每个维度的值,并且如果我创建了Box box[int][int]
变量,可以在类中使用它,无法知道尺寸。使用一些代码会更好理解。
这段代码允许我用所需的尺寸创建Box数组,因为它位于板构造器中,而不是创建时具有框数的参数,但是不允许我在其中使用“casilla”变量该类(class)的其他部分或其他类(class):
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];
}
没错,但是在我知道它们之前,必须先给出casilla阵列的尺寸,因此,它们可能是错误的(因为电路板的尺寸可能不同)。
这是我第一次使用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个声誉,但是当我拥有它时,我将对所有人进行投票。真的,感谢您的所有回答。我只需要知道我对已检查答案的评论即可,所有答案都将得到回答。
最佳答案
数组解决方案
//----------------------------------------------------------------------------
#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。
但是,作为草稿,它可以工作。