Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;?_C++_Arrays_Oop_Memory Management_Matrix - Fatal编程技术网

C++ 如何在c++;?

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

我已经创建了类对象的动态矩阵,但是我在处理返回的指针时弄得一团糟

我的目的是创建一个类点矩阵(intx,inty),然后在程序中以不同的方式使用它。 一切正常,但我无法理解函数之间的返回指针游戏

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 ];
        }
        //  ...
    };