web-dev-qa-db-ja.com

C ++での動的オブジェクトの動的配列の作成

動的オブジェクトの配列を作成する方法を知っています。

たとえば、クラス名はStockです。

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

これを動的オブジェクトの動的配列にどのように変更しますか?

私が試したこと:

在庫stockArrayPointer = new Stock stock [4];

これは機能せず、エラーは「Stock **の値を使用してStockタイプのエンティティを初期化することはできません。

2番目の質問は、動的オブジェクトの動的配列を作成した後、配列内のポインターにアクセスするための構文は何ですか。

ここで、stockArray [i] = new Stock();を使用します。これはどのように変わりますか?

これに関するガイダンスが必要です...

5
lakesh

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;
9
akaltar

動的配列への変数の型は、配列の最初のオブジェクトへのポインターです。動的に割り当てられた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;
5
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演算子を誤って使用していることを意味するためです。

2
mono

私は完璧に機能する何かをしました:

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

はい...配列部分のポインターへのポインターを使用しましたが、可変サイズの配列では完全に機能しました。

1