Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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_Function_Memory - Fatal编程技术网

C++ 用C+函数实现动态矩阵+;

C++ 用C+函数实现动态矩阵+;,c++,arrays,function,memory,C++,Arrays,Function,Memory,伙计们,我想通过使用函数实现动态二维数组(为了更容易创建数组,当我要解决不同的任务时)。 我使用下一种内存分配方式: 创建一个大型MxN阵列 创建一个包含M个指针元素的数组 代码: intmain() { int*A1; 国际**A; A1=新的T[M*N]; A=新的T*[M]; 对于(int i=0;i您缺少一个封装级别-创建一个矩阵类,无法同时管理内存和指针。作为一个积极的副作用,您将能够为新数据类型定义自定义运算符,并提高代码的可读性。我找到了另一种方法,因为[0]从理论上讲,当我

伙计们,我想通过使用函数实现动态二维数组(为了更容易创建数组,当我要解决不同的任务时)。 我使用下一种内存分配方式:

  • 创建一个大型MxN阵列
  • 创建一个包含M个指针元素的数组
  • 代码:

    intmain()
    {   
    int*A1;
    国际**A;
    A1=新的T[M*N];
    A=新的T*[M];
    
    对于(int i=0;i您缺少一个封装级别-创建一个矩阵类,无法同时管理内存和指针。作为一个积极的副作用,您将能够为新数据类型定义自定义运算符,并提高代码的可读性。

    我找到了另一种方法,因为[0]从理论上讲,当我们使用
    delete[]A[0]
    时,收集与A1相同的内存地址,这与
    delete[]A1
    相似,还是否

    #ifndef MATRIX_H
    #define MATRIX_H
    
    
    namespace matrix
    {
    
    
    template <typename T> T** create_matrix(int N, int M)
       {
       int *A1;
       int **A;
    
       A1 = new T  [M*N];
       A  = new T* [M];
    
       for(int i=0;i<M;i++)
          {
          A[i]=(A1+(i*M));
          }
    
       return A; 
       }
    
    template <typename T> void delete_matrix(T** A)
       {
       delete []A;
       delete []A[0]; //this is must be equivalent to delete []A1
       }
    
    
    
    }
    #endif
    
    #ifndef矩阵
    #定义矩阵
    名称空间矩阵
    {
    模板T**创建矩阵(整数N,整数M)
    {
    int*A1;
    国际**A;
    A1=新的T[M*N];
    A=新的T*[M];
    
    对于(int i=0;i如何创建一个模板类来维护
    A1
    a
    ?函数只能返回一个值,这是正确的,但这也意味着它们基本上可以返回任何值,例如
    struct Foo{int*A1;int**a;}我在C++中没有学习OOP,如果我可以的话,我将在未来的学习主题中解释一下如何解决这个问题,不需要OOP。非常感谢。打开你的C++书中的章节,讨论<代码> STD::向量< /代码>,然后开始阅读。你会惊讶地发现C++库可以为你做所有这些分配,并自动完成。Y删除基本指针,不用担心一件事!感谢回答,但是STD::vector或OOP,或者结构只是解决这个问题的方法?所以只有OOP方式才是最好的?现在我不知道C++中的OOP。@ WhiteBear不是OOP。你可以在C++中定义自定义数据类型,就像C++中添加的那样。很好的OOP概念对你很有用,但是你不需要使用它们,只需要使用逻辑数据分组(最好使用RAII内存管理)和专用的类型签名,这样算法和操作符就可以识别它(或者专门为它编写)。不是OOP本身。如果可能的话,你能有一个链接来阅读这篇文章吗(对于初学者)@ WhiteBear + C++通过阅读书籍和使用同行评审的教程(不是你在网上找到的垃圾)更好地学习。如果你是初学者,没有人能给你一个链接,因为有很多东西可以作为前提学习。
    
    #ifndef MATRIX_H
    #define MATRIX_H
    
    
    namespace matrix
    {
    
    
    template <typename T> T** create_matrix(int N, int M)
       {
    
       int *A1;
       int **A;
    
       A1 = new T  [M*N];
       A  = new T* [M];
    
       for(int i=0;i<M;i++)
           {
           A[i]=(A1+(i*M));
           }
    
       return A; //how to return also A1 for preventing memory leack
       }
    
    template <typename T> void delete_matrix(T* A1, T** A)
       {
       delete []A;
       delete []A1;
       }
    
    }
    
    
    #endif
    
    #ifndef MATRIX_H
    #define MATRIX_H
    
    
    namespace matrix
    {
    
    
    template <typename T> T** create_matrix(int N, int M)
       {
       int *A1;
       int **A;
    
       A1 = new T  [M*N];
       A  = new T* [M];
    
       for(int i=0;i<M;i++)
          {
          A[i]=(A1+(i*M));
          }
    
       return A; 
       }
    
    template <typename T> void delete_matrix(T** A)
       {
       delete []A;
       delete []A[0]; //this is must be equivalent to delete []A1
       }
    
    
    
    }
    #endif