【问题标题】:Creation of Dynamic Array of Dynamic Objects in C++在 C++ 中创建动态对象的动态数组
【发布时间】:2013-12-16 17:11:30
【问题描述】:

我知道如何创建动态对象数组。

例如,类名是 Stock。

Stock *stockArray[4];
for(int i = 0 ; i < 4;i++)
{
   stockArray[i] = new Stock();
}

如何将其更改为动态对象的动态数组?

我尝试了什么:

股票 stockArrayPointer = 新股票股票[4];

它不起作用,错误是“Stock** 的值不能用于初始化 Stock 类型的实体。

第二个问题是动态对象的动态数组创建后,访问数组中指针的语法是什么。

现在,我使用 stockArray[i] = new Stock();这将如何改变?

需要一些指导...

【问题讨论】:

  • 为什么不使用向量?
  • 动态对象的动态数组是什么意思?你能详细说明一下吗?
  • 堆中的数组,数组中的东西也在堆中...
  • 为什么不只是 Stock *stockArray = new Stock[4];

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

我做了一件完美的事情:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std; 

class student {
    string name;
    int age;
    int roll;
    public:
        student() {
            name="";
            age=0;
            roll=0;
        }
        student (string n, int a, int r) {
            name=n;
            age=a;
            roll=r;
        }
        void show_details (); 
};
void student::show_details() {
    cout << "Name: " << name << "\n";
    cout << "Age: " << age << "\n";
    cout << "Roll No: " << roll << "\n";
}
int main() {
    string a; int b, c, n;
    cin >> n;
    student **obj;
    obj=(student**)malloc(n*sizeof(student*));
    for (int i=0; i<n; i++) {
        cin >> a;
        cin >> b;
        cin >> c;
        obj[i]=new student(a,b,c);
    }
    for (int i=0; i<n; i++) {
        obj[i]->show_details();
    }
    for (int i=0; i<n; i++) free (obj[i]);
    free (obj);
}

是的...我使用了指向数组部分的指针,它非常适用于可变大小的数组。

【讨论】:

    【解决方案2】:
    Stock* stockArrayPointer = new Stock [4];
    

    仅当 Stock 类具有零参数构造函数时才有效 如果它没有任何零参数构造函数,则无法动态创建动态对象数组

    你可以像上面所说的那样用静态数组创建一个动态对象数组

    Stock stockArrayPointer[4]={Stock(args),Stock (args)};
    

    但语法

    Stock* stockArrayPointer=new Stock[4]{Stock(args),Stock (args)}; does not hold
    

    或如前所述
    使用向量...
    向量是在堆上分配的内存
    所以向量是动态分配的

    vector<Stock> V;
    V.push_back(Stock(args));
    

    V.push_back(new Stock(args));
    

    原因

    Stock* stockArrayPointer=new Stock[4]{Stock(args),Stock (args)};
    

    不成立 是因为 这意味着 您错误地使用了 new 运算符

    【讨论】:

      【解决方案3】:

      动态数组的变量类型是指向数组第一个对象的指针。你想要一个动态分配的 Stock 对象数组,一个指向 Stock 的指针数组,所以你的变量是一个指向 Stock 的指针:

      int n = 4; // dynamic size of the array;
      Stock** stockArray = new Stock*[n];
      for (int i = 0; i != n; ++i)
      {
          stockArray[i] = new Stock();
      }
      

      并释放它:

      for (int i = 0; i != n; ++i)
      {
          delete stockArray[i];
      }
      delete[] stockArray;
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 c++,那么您不应该重新发明轮子,只需使用vectors

        #include <vector>
        
        std::vector< std::vector< Stock > > StockVector;
        
        // do this as many times as you wish
        StockVector.push_back( std::vector< Stock >() );
        
        // Now you are adding a stock to the i-th stockarray
        StockVector[i].push_back( Stock() );
        

        编辑:

        我不明白你的问题,如果你只想在堆上分配数组,只需使用:

        Stock** StockArrayArray = new Stock*[n]; // where n is number of arrays to create
        for( int  i = 0; i < n; ++i )
        {
            StockArrayArray[i] = new Stock[25];
        }
        
        // for freeing
        for( int i = 0; i < n; ++i )
        {
            delete[] StockArrayArray[i];
        }
        delete[] StockArrayArray;
        

        【讨论】:

        • 只是数组。只想使用数组。
        • @Lance :仅仅因为a[i] 等价于*(a+i) 并不意味着这两种数据类型密切相关,也不能将它们称为“语法糖”。请注意有关数组和指针的 C 常见问题解答:c-faq.com/aryptr,尤其是c-faq.com/aryptr/practdiff.html
        • @DanielKamilKozar 这是我程序中的要求。因此。希望你能理解..
        • @lakesh : 那我只能为你的作业和老师感到难过。
        • @lakesh 我相信你误解了你的任务。用 new 分配的数组已经存储在堆上,并且可以在运行时调整其大小(与静态声明的数组相反,静态声明的数组具有编译时固定大小并存储在堆栈上)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多