2013-11-30 6 views
4

Я знаю, как создать массив динамических объектов.Создание динамического массива динамических объектов в C++

Например, имя класса Stock.

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

Как вы это изменяете для динамического массива динамических объектов?

Что я пробовал:

Stock stockArrayPointer = новый Stock запас [4];

Он не работает и ошибка «Значение запаса ** не может быть использована для инициализации объекта типа запаса.

Второго вопроса после создания динамического массива динамических объектов, что синтаксис для доступа указателей в массиве

Теперь я использую stockArray [я] = новый Stock().? Как это изменение

нужны некоторые рекомендации по этому вопросу ...

+0

Почему вы не используете векторы? – Nik

+0

Что вы подразумеваете под динамическим массивом динамических объектов? Можете ли вы уточнить? –

+1

массив, находящийся в куче, и вещи в массиве также находятся в куче ... – lakesh

ответ

6

Если вы используете 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()); 

Edit:

я не понял ваш вопрос, если вы просто хотите иметь и массив массивов, выделенных на куче просто использовать:

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

только массивы. просто хотите использовать массивы. – lakesh

+0

Массивы - это просто синтаксический сахар для указателей в C++. – Lance

+1

@Lance: Просто потому, что 'a [i]' эквивалентно '* (a + i)' не означает, что эти два типа данных тесно связаны, и что их можно назвать «синтаксическим сахаром». Пожалуйста, соблюдайте часто задаваемые вопросы по C в разделах массивов и указателей: http://c-faq.com/aryptr/, особенно http://c-faq.com/aryptr/practdiff.html –

4

В Тип переменной в динамический массив является указателем на первый объект массива. Вы хотите, чтобы массив динамически выделенных объектов изображения, поэтому массив указателей на складе, так что ваша переменная является указателем на указатель на складе:

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

не держит потому, что этого означает вы с помощью нового оператора неправильно

0

я сделал то, что работало отлично:

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

Да ... Я использовал указатель на указатель на часть массива, и она работала отлично для размера массивов переменных.

Смежные вопросы