やりたいこと
九九の計算をobj1の中の配列に格納して、obj2に深いコピー(コピーコンストラクタ)を用いてコピーする
困っていること
コピーコンストラクタのところでエラーが生じて進まない。
コピーコンストラクタをコメントアウトした場合はきちんと動作した。
コピーコンストラクタを呼び出すところ”kuku_array obj2 = obj1;”においてコピーコンストラクタの中身までは言っていることが確認できたが(yesの出力があった)for文に入ったところで止まってしまっている。
newで作成した2次元配列の開放の仕方が分からない。(今のやり方だと1次元のみな気がする)
エラーコード
exited segmentation fault
c++
1#include <iostream> // coutのため 2#include <iomanip> // setwのため 3using namespace std; 4 5 6class kuku_array { 7// write here... 8public: 9 int **n; 10 int i; 11 int j; 12 kuku_array(){//九九を格納する2次元配列を作成するコンストラクタ 13 n = new int*[20]; 14 for( int i = 0; i < 20; i++ ){ 15 n[i] = new int[20];//この時点では空だから、mainの方で値を入れる 16 } 17} 18 19 void kuku_in(int a,int b){ 20 n[a][b] = a*b; 21 } 22 23 kuku_array(const kuku_array &obj){//なぜ引数がポインタ型ののか??? 24cout << "yes" << endl; 25 for(i = 1; i < 10; i++){ 26 for(j = 1; j < 10; j++){ 27 n[i][j] = obj.n[i][j]; //引数の配列をコピー 28 } 29 cout << i << endl; 30 } 31 } 32 33 void kuku_show(){ 34 cout<<setw(2)<<"|"<<setw(3)<<1 <<setw(3)<<2 <<setw(3)<<3 <<setw(3)<<4 <<setw(3)<<5 <<setw(3)<<6 <<setw(3)<<7 <<setw(3)<<8 <<setw(3)<<9 <<endl; 35 36 // 横線の表示 37 cout<<"-------------------------------"<<endl; 38 39 40 // 九九本体の表示 41 42 for(i = 1; i < 10; i++){ 43 cout<<i<<"|"; 44 for(j = 1; j < 10; j++){ 45 cout<<setw(3)<<n[i][j]; 46 } 47 cout <<endl; 48 } 49 } 50 51 ~kuku_array(){ 52 cout << "Destructor is called." << endl; 53 delete[] n; 54 n = 0; 55 } 56 57}; 58 59int main() { 60 61 // 九九オブジェクトobj1の生成 62 // write here... 63 kuku_array obj1; 64 int i,j; 65cout << "Hello!" << endl; 66 67 68 // 九九を計算して、obj1の配列に入れる 69 // write here... 70 for( i = 0 ;i < 10 ; i++ ){ 71 for(j = 0 ; j < 10 ; j++ ){ 72 obj1.kuku_in(i,j); 73 } 74 cout << i << endl; 75 } 76 77 78 79 80 // 九九オブジェクトobj2にobj1の中身をコピーする 81 // write here... 82 obj1.kuku_show(); 83 84 kuku_array obj2 = obj1; //obj1の中身をobj2にコピーする 85 86 87 88 // obj2に保持されている九九を表示する 89 // write here... 90 obj2.kuku_show(); 91 92 93 94 return 0; 95} 96
実行結果
Hello!
0
1
2
3
4
5
6
7
8
9
| 1 2 3 4 5 6 7 8 9
1| 1 2 3 4 5 6 7 8 9
2| 2 4 6 8 10 12 14 16 18
3| 3 6 9 12 15 18 21 24 27
4| 4 8 12 16 20 24 28 32 36
5| 5 10 15 20 25 30 35 40 45
6| 6 12 18 24 30 36 42 48 54
7| 7 14 21 28 35 42 49 56 63
8| 8 16 24 32 40 48 56 64 72
9| 9 18 27 36 45 54 63 72 81
yes
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー