2012-02-16 6 views
1

私はクラスで動的メモリ割り当てを開始していますが、それをよく理解していますが、正しく使用することはできません。私はポインタとそれほど大きくないかもしれないように私はどちらかと感じ:P関数から動的に割り当てられたポインタ配列を返すにはどうすればよいですか?

は私のインストラクターは、動的ににサイズとして使用する番号をユーザに促しますreadArrayという名前の関数を作成するための指示を出したの整数配列を作成しますそのサイズ。次に、新しい配列をポインタに代入します。私は、配列を埋めるようにユーザに促すはずです。私はそれから、新しく作成された配列とサイズの両方を返すことになっています。

私は配列を返す方法を考え出すことができませんし、リークを防ぐために使用した後に割り当てを削除するはずのメモリを動的に割り当てるときに考えました。

ソート関数などの他の関数に渡すために、配列とサイズをmainに戻す必要があります。

これで私の思考プロセスが間違った方向に向いているので、私が得ることができる助けに感謝します。

#include <iostream> 
using namespace std; 

int* readArray(int&); 
void sortArray(int *, const int *); 

int main() 
{ 
    int size = 0; 
    int *arrPTR = readArray(size); 
    const int *sizePTR = &size; 
    sortArray(arrPTR, sizePTR); 

    cout<<arrPTR[1]<<arrPTR[2]<<arrPTR[3]<<arrPTR[4]; 

     system("pause"); 
     return 0; 
} 


int* readArray(int &size) 
{ 
    cout<<"Enter a number for size of array.\n"; 
    cin>>size; 
    arrPTR = new int[size]; 

    for(int count = 0; count < (size-1); count++) 
    {  
     cout<<"Enter positive numbers to completely fill the array.\n"; 
     cin>>*(arrPTR+count); 
    } 

    return arrPTR; 
} 
+0

あなたの例では、readArrayのプロトタイプが実装しているものと少し違っています。必ずしも必要ではありませんが、プロトタイプに変数名を与えて、それらが何をしているかを文書化するのを助けるかもしれません。 – Firedragon

+1

一般的にソリューションに一致するようにサンプルコードを変更する必要はありません。それが答えです(これはあなたがこのような更新を行うときに意味がないかもしれません)。 – crashmstr

+1

C++のほとんどのクラスはおそらくこのような生の配列をカバーしていますが、これは悪い考えです。初心者は、ベクタを使用するように教えて、生の配列と手動の動的割り当てを後で進んだトピックとしてコースに残しておく必要があります。これはBjarne Stroustrupの素敵な初心者の本[_Programming-Principals and Practice Using C++ _](http://www2.research.att.com~bs/programming.html)がそれを処理する方法です。 – bames53

答えて

5

は、配列を返します。このようにして、arrPTRが指す動的に割り当てられた配列を返します。

削除について:配列の使用が終了したら、実際に削除する必要があります。あなたの例では、あなたのmain()機能のreturn 0の前にそれをしてください。
new[]でメモリを割り当てたので、delete[]でメモリを解放する必要があります。それ以外の場合は、プログラムにメモリリークが発生します。

+0

すべての例をコピーして編集してください:P – Vyktor

+1

'delete [] 'で削除されていることを確認してください – Joe

+2

@Vyktor:これは宿題です。私はあなたに提案していることをすれば、彼はそれから学ばないでしょう。 – amit

6

あなたがstd::vector<int>を使用する場合よりもはるかに優れな選択であることを行う必要がありません。

はそれを使用:readArray()int* readArray()よう代わりintint*を返す]宣言、及びarrPTR代わりにsizeを返す:

std::vector<int> readArray() 
{ 
    int size = 0; 
    cout<<"Enter a number for size of array.\n"; 
    cin >> size; 
    std::vector<int> v(size); 

    cout<<"Enter "<< size <<" positive numbers to completely fill the array : "; 
    for(int i = 0; i < size; i++) 
    { 
     cin>> v[i]; 
    } 
    return v; 
} 
+2

これは完璧な解決策になりますが、今は 'new'演算子の使用法を学ぶべきです。ベクトル(および他のコンテナ)について言及すると混乱するかもしれません。私見では。 – Vyktor

+0

はい、それはより良い解決策ですが、先生が教えようとしていることを彼は理解していないのですか? – crashmstr

+1

私はまだベクトルについて学習しておらず、その割り当てはポインタと新しい演算子の使用に関して非常に具体的です。 – sircrisp

1

amitと同様、おそらくサイズの代わりに配列を返すべきです。しかし、あなたはまだ大きさを必要とするので、そのようreadArrayを変更:

///return array (must be deleted after) 
///and pass size by reference so it can be changed by the function 
int* readArray(int &size); 

とこのようにそれを呼び出す:アップデート後

int size = 0; 
int *arrPTR = readArray(size); 
///....Do stuff here with arrPTR 
delete arrPTR[]; 

:あなたを持っているので

int* readArray(int size); ///input only! need the & in the declaration to match 
          ///the function body! 

は、間違っていると実際の定義はint &sizeです。 また、arrPTRreadArrayに宣言していないので、それを割り当ててください。

関連する問題