C++ 如何在c++;?
我已经创建了类对象的动态矩阵,但是我在处理返回的指针时弄得一团糟 我的目的是创建一个类点矩阵(intx,inty),然后在程序中以不同的方式使用它。 一切正常,但我无法理解函数之间的返回指针游戏C++ 如何在c++;?,c++,arrays,oop,memory-management,matrix,C++,Arrays,Oop,Memory Management,Matrix,我已经创建了类对象的动态矩阵,但是我在处理返回的指针时弄得一团糟 我的目的是创建一个类点矩阵(intx,inty),然后在程序中以不同的方式使用它。 一切正常,但我无法理解函数之间的返回指针游戏 class Point { private: int x; int y; public: Point(int x,int y); void SetPoint(int x,int y); }; 在第二个类中,我使用点对象作为类成员 Init_Pal
class Point
{
private:
int x;
int y;
public:
Point(int x,int y);
void SetPoint(int x,int y);
};
在第二个类中,我使用点对象作为类成员
Init_Pallet()用于初始化矩阵
class Warehouse
{
private:
Robot r1,r2;
Point *Pallet_Matrix;
public:
Point* Init_Pallet();
};
这是Init函数
Point* Warehouse::Init_Pallet()
{
int rows =10,cols =10;
Point** Pallet_Matrix = new Point*[rows];
for (int i = 0; i < rows; i++)
Pallet_Matrix[i] = new Point[cols];
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; j++) //Pallet matrix Init, x point for robots amount in position and y for box amount
Pallet_Matrix[i][j].SetPoint(0,0);
return *Pallet_Matrix;
}
我的问题是:如何将地址从Init函数返回到矩阵开头,并返回给调用它的C'Tor?
第二个问题:在将矩阵地址返回给C'Tor之后,如何以矩阵[i][j]的格式访问矩阵的不同位置
提前感谢您的帮助和宝贵时间。您应该先让
初始化托盘
返回点**
,然后执行返回托盘矩阵代码>。当前,您正在复制从函数中分配的一个点*
s,因此该副本不再是可以索引的连续数组的一部分
不要忘记删除[]
析构函数中的动态数组
但是,您应该更喜欢使用标准库容器,如std::array
或std::vector
。这样,您就不必担心自己的动态分配,也不必担心指针会弄乱
如果我这样做,我会:
class Warehouse
{
public:
Warehouse() : Pallet_Matrix() { }
private:
Robot r1,r2;
std::array<std::array<Point, 10>, 10> Pallet_Matrix;
};
类仓库
{
公众:
仓库():托盘_矩阵(){}
私人:
机器人r1,r2;
std::阵列矩阵;
};
就这样。不需要init
。没有动态分配。不为每个元素分配0(如果您给点一个默认构造函数,该构造函数由零初始化)。完成。您应该让初始化托盘
返回点**
,然后执行返回托盘矩阵代码>。当前,您正在复制从函数中分配的一个点*
s,因此该副本不再是可以索引的连续数组的一部分
不要忘记删除[]
析构函数中的动态数组
但是,您应该更喜欢使用标准库容器,如std::array
或std::vector
。这样,您就不必担心自己的动态分配,也不必担心指针会弄乱
如果我这样做,我会:
class Warehouse
{
public:
Warehouse() : Pallet_Matrix() { }
private:
Robot r1,r2;
std::array<std::array<Point, 10>, 10> Pallet_Matrix;
};
类仓库
{
公众:
仓库():托盘_矩阵(){}
私人:
机器人r1,r2;
std::阵列矩阵;
};
就这样。不需要init
。没有动态分配。不为每个元素分配0(如果您给点一个默认构造函数,该构造函数由零初始化)。完成。问题在于返回的Init_Pallet()
类型错误-它是一行,而不是一个矩阵。在Warehouse::Init_Pallet()
的最后一行中,您取消了对矩阵的正确指针的引用,从而获得了指向矩阵第一行的指针
您需要编写点**托盘矩阵代码>在仓库
中,使用点**仓库::初始托盘()
定义初始托盘()
,并在初始托盘()的最后一行中使用返回托盘矩阵
符号点*行
表示行
是“点数组”或“指向点数组开头的指针”。符号点**矩阵
表示矩阵
是“指向点数组开头的指针数组”或“指向这样一个数组开头的指针”。问题在于返回的Init_Pallet()
类型错误-它是一行,而不是一个矩阵。在Warehouse::Init_Pallet()
的最后一行中,您取消了对矩阵的正确指针的引用,从而获得了指向矩阵第一行的指针
您需要编写点**托盘矩阵代码>在仓库
中,使用点**仓库::初始托盘()
定义初始托盘()
,并在初始托盘()的最后一行中使用返回托盘矩阵
符号点*行
表示行
是“点数组”或“指向点数组开头的指针”。表示法Point**matrix
表示matrix
是“指向点数组开头的指针数组”或“指向这样一个数组开头的指针”。如何将从Init函数返回到C'Tor的矩阵开头的地址
如果您真的只需要第一个元素的地址,那么非常简单的方法是:
return &Pallet_Matrix[0][0];
返回矩阵地址后,如何以矩阵[i][j]的格式访问矩阵的不同位置
Init_Pallet
是一个成员函数,它可以直接与Pallet_矩阵
成员一起工作。否则,Init_Pallet
函数实际上可能返回点**
,但这应该会让您觉得此代码有问题
更好的[1]解决方案是:
return &Pallet_Matrix[0][0];
定义点的默认构造函数
:
class Point
{
public:
Point() : x(0), y(0){}
...
使用std::vector
s代替动态分配的数组:
class Warehouse
{
private:
std::vector< std::vector<Point> > Pallet_Matrix;
您只需使用std::vector
的构造函数:
int rows = 10, cols = 10;
Pallet_Matrix = std::vector< std::vector<Point> >(rows, cols);
int行=10,cols=10;
托盘矩阵=标准::向量<标准::向量>(行,列);
[1] Better=您不想自己处理内存管理。如何将地址返回到从Init函数到C'Tor的矩阵开头
如果您真的只需要第一个元素的地址,那么非常简单的方法是:
return &Pallet_Matrix[0][0];
我该怎么办
class Matrix
{
int m_rows;
int m_columns;
std::vector<Point> m_data;
public:
Matrix( int rows, int columns )
: m_rows( rows )
, m_columns( columns )
, m_data( rows * columns, Point( 0, 0 ) )
{
}
Point& operator()( int i, int j )
{
return m_data[ i * m_columns + j ];
}
// ...
};