我试图从一个较小的2D Array对象返回一个数组Data Member,并尝试将该数组插入一个更大的2D数组对象中。但是在尝试这个时,我遇到了两个问题。
第一个问题是我想返回2D数组的名称,但我不知道如何正确语法来返回2D数组名称。
这是我的2D Array数据成员的样子
private: int pieceArray[4][4]; // 2D Smaller Array
我希望将此数组返回到函数中,但是这会导致编译器错误:
int Piece::returnPiece() { return pieceArray; //not vaild // return the 2D array name }
我厌倦了使用这种返回类型并且它起作用了:
int Piece::returnPiece() { return pieceArray[4][4]; }
但我不确定这是否是我想要的,因为我想要返回数组及其所有内容。
另一个问题是InsertArray()函数,我将把returnPiece()函数放在InsertArray()的参数中。
InsertArray()的问题是参数,下面是代码:
void Grid::InsertArray( int arr[4][4] ) //Compiler accepts, but does not work { for(int i = 0; i < x_ROWS ; ++i) { for (int j = 0; j < y_COLUMNS ; ++j) { squares[i][j] = arr[i][j]; } } }
这个问题是它不接受我的returnPiece(),如果我删除“[4] [4]”,我的编译器不接受。
大多数都是语法错误,但我该如何解决这些问题?
这三个是我需要帮助的主要问题,当我尝试使用指针指针方法时遇到了同样的问题。有谁知道如何解决这三个问题?
答案 0 :(得分:3)
传递数组时,必须决定是否要复制数组,或者只是想返回指向数组的指针。对于返回数组,您不能(轻松地)返回副本 - 您只能返回指针(或C ++中的引用)。例如:
// Piece::returnPiece is a function taking no arguments and returning a pointer to a
// 4x4 array of integers
int (*Piece::returnPiece(void))[4][4]
{
// return pointer to the array
return &pieceArray;
}
要使用它,请按以下方式调用:
int (*arrayPtr)[4][4] = myPiece->returnPiece();
int cell = (*arrayPtr)[i][j]; // cell now stores the contents of the (i,j)th element
注意类型声明与使用它之间的相似性 - 括号,解引用运算符*
和括号位于相同的位置。
您对Grid::InsertArray
的声明是正确的 - 它需要一个参数,这是一个4x4整数数组。这是按值调用:每当你调用它时,你都会复制4x4数组,所以你所做的任何修改都不会反映在传入的数组中。如果你想要使用call-by-reference,你可以将指针传递给数组:
// InsertArray takes one argument which is a pointer to a 4x4 array of integers
void Grid::InsertArray(int (*arr)[4][4])
{
for(int i = 0; i < x_ROWS; i++)
{
for(int j = 0; j < y_COLUMNS ; j++)
squares[i][j] = (*arr)[i][j];
}
}
这些带有多维数组指针的类型声明可能会让人很快感到困惑。我建议像这样制作一个typedef
:
// Declare IntArray4x4Ptr to be a pointer to a 4x4 array of ints
typedef int (*IntArray4x4Ptr)[4][4];
然后你可以宣布你的函数更具可读性:
IntArray4x4Ptr Piece::returnPiece(void) { ... }
void Grid::InsertArray(IntArray4x4Ptr arr) { ... }
您还可以使用cdecl程序来帮助破译复杂的C / C ++类型。
答案 1 :(得分:0)
看起来你需要阅读更多有关C ++中的指针以及按引用传递而不是按值传递的信息。
您的returnPiece方法定义为返回单个单元格的值。给定索引(例如,[4] [4]),您将返回该单元格内容的副本,因此您将无法更改它,或者更准确地说,更改它将更改副本。
我确信有人会给你正确的语法,但我真的建议学习这些东西,否则你可能会使用你错误的代码。
答案 2 :(得分:0)
我将如何做到这一点:
class Array { public: Array() { for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { (*this)(i, j) = 0; } } } int &operator()(int i, int j) { return pieceArray[i][j]; } private: int pieceArray[4][4]; };
然后您可以执行以下操作:
Array x; // create 4x4 array x(1, 2) = 3; // modify element
答案 3 :(得分:0)
在 Piece :: pieceArray 中 Adam Rosenfield的 arrayPtr 的麻烦可以从你的下方改变。 (按引用复制和按值复制。)
按值复制效率低下。但如果你真的想这样做,那就是欺骗:
struct FOO { int piece [4][4]; };
FOO Piece::returnPiece()
{
FOO f;
memcpy( f.piece, pieceArray, sizeof(pieceArray) );
return f;
}
void Grid::InsertArray( const FOO & theFoo )
{
// use theFoo.piece[i][j]
}
当然,更好的,更面向对象的解决方案是让 returnPiece()创建并返回 Piece 或 Array 宾语。 (正如 Juan 建议的那样......)