C++ 動的確保について
学校の演習課題で「クラス Array のメンバ変数を以下のように変更して,配列のサイズを実行時に決められるようにしたい.コンストラクタを適切に修正しなさい.配列のサイズはコンストラクタの引数で指定できるようにすること.main 関数内のオブジェクトの宣言部分を適当に変更して動作を確認しなさい.」という課題が出ました。
指示のメンバ変数の変更は、sizeを定数にしていたものを変数にし、arrayを配列からポインタにする点です。
もとのプログラムはI、私がいじったものがIIです。どうにもセグメンテーションフォルトから抜け出せなくて困っています。どのようにしたら題意のプログラムになるのでしょうか?
よろしくお願いします。
ここからI~
#include <iostream>
using namespace std;
class Array{
private:
const static int size = 6;
int array[size];
public:
Array( );
int getSize( );
void put( int index, int data );
int get( int index );
void show( );
};
Array::Array( )
{
for ( int i = 0; i < size; i++ ) {
array[i] = 0;
}
}
int Array::getSize( ) {
return size;
}
void Array::put( int index, int data ) {
array[index] = data;
}
int Array::get( int index ) {
return array[index];
}
void Array::show( ) {
cout << "| ";
for ( int i = 0; i < getSize( ); i++ ) {
cout << get(i) << " | ";
}
cout << endl;
}
int main( ) {
Array array1;
array1.put(1, 2);
array1.put(4, 1);
array1.show( );
return 0;
}
~ここまでI
ここからII~
#include <iostream>
using namespace std;
class Array{
private:
int size;
int *array;
public:
Array(int s);
~Array();
int getSize();
void put(int index, int data);
int get(int index);
void show();
};
Array::Array(int s)
{
size = s;
array = new int;
for (int i = 0; i < size; i++) {
*array = 0;
array++;
}
array -= size;
}
Array::~Array()
{
delete[] array;
cout << "デストラクタが呼ばれました。配列の要素数分のメモリを開放します." << endl;
}
int Array::getSize() {
return size;
}
void Array::put(int index, int data) {
*(array + index) = data;
}
int Array::get(int index) {
return *(array + index);
}
void Array::show() {
cout << endl << "| ";
for (int i = 0; i < getSize(); i++) {
cout << get(i) << " | ";
}
cout << endl;
}
int main() {
int s = 0;
cout << "確保するサイズを入力してください:";
cin >> s;
Array array1(s);
array1.put(1, 2);
array1.put(4, 1);
array1.show();
return 0;
}
~ここまでII
お礼
なるほど~ こんな方法もあるのですね。 とても勉強になります。 ご回答ありがとうございます。