C++中创建动态对象的动态数组

7

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

例如,类名为Stock。

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

如何将此更改为动态对象的动态数组?
我尝试过:
Stock** stockArrayPointer = new Stock*[4];
但它不起作用,并显示错误消息:“Stock**的值不能用来初始化类型为Stock的实体。”
第二个问题是在创建动态对象的动态数组之后,访问数组中指针的语法是什么?
现在,我使用stockArray[i] = new Stock(); 这将如何更改?
需要一些指导……

为什么不使用向量? - Nik
动态对象的动态数组是什么意思?你能详细解释一下吗? - Abhishek Bansal
1
一个在堆中的数组,数组中的元素也在堆中... - lakshmen
1
为什么不直接使用 Stock *stockArray = new Stock[4]; 呢? - Abhishek Bansal
4个回答

11

如果你正在使用C ++,那么你不应该重新发明轮子,只需使用向量

#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;

1
只使用数组。 - lakshmen
1
@Lance:仅仅因为a[i]等同于*(a+i)并不意味着这两种数据类型密切相关,也不能称之为“语法糖”。请参考C语言常见问题解答关于数组和指针的内容:http://c-faq.com/aryptr/,特别是http://c-faq.com/aryptr/practdiff.html。 - Daniel Kamil Kozar
1
@DanielKamilKozar 这是我的程序要求,希望你能理解。 - lakshmen
1
@lakesh:那么我只能为你的作业和老师感到难过。 - Daniel Kamil Kozar
1
@lakesh,我认为你误解了你的任务。使用new分配的数组已经存储在堆上,并且其大小可以在运行时进行调整(与静态声明的数组相反,后者具有编译时固定的大小,并存储在堆栈上)。 - akaltar
显示剩余4条评论

8

动态数组的变量类型是指向数组第一个对象的指针。您需要一个动态分配的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

我做了一些事情,完美地达到了预期效果:

#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);
}

是的...我在数组部分使用了指针,对于变长数组来说它完美地工作了。


太好了,所以你正在将一个新的类对象分配给指向指针数组obj中的每个第i个位置。 - AZ123

3
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 操作符,这意味着。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接