我在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点声望,但是当我拥有它时,我会全力支持你们。真的,谢谢你的所有答案。我只需要知道我对选中的答案所评论的内容,它就会全部回答。
答案 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 ++中,没有绑定检查数组解除引用,因此这会返回一些超出范围的内存位置并且非常糟糕。
您可以使用malloc
和free
自行创建动态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数组,但取决于哪个最适合您的目的。