質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

448閲覧

C++のコンパイル時に例外が送出される

yu_89

総合スコア34

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/04/04 06:02

解決したいこと

C++のコンパイル時に例外が送出されプログラムが強制終了してしまいます。
柴田望洋の「c++で学ぶオブジェクト指向プログラミング」を参考にしています。
調べて色々試したのですが、解決しません。何が原因なのでしょうか。

発生している問題・エラーメッセージ

x[0] = false x[1] = false x[2] = false x[3] = false x[4] = false x[5] = false x[6] = false x[7] = false x[8] = false x[9] = false x[10] = false x[11] = false x[12] = false x[13] = false x[14] = false terminate called after throwing an instance of 'Array<bool>::IdxRngErr' 中止 (コアダンプ)

該当のソースコード

Array.h

1#ifndef ___Array 2#define ___Array 3 4template <class Type> class Array 5{ 6 int nelem; 7 Type* vec; 8 9 bool is_valid_index(int idx) { return idx >= 0 && idx < nelem; } 10 11public: 12 13 class IdxRngErr{ 14 const Array* ident; 15 int idx; 16 17 public: 18 IdxRngErr(const Array* p, int i) : ident(p), idx(i) {} 19 int Index() const { return idx; } 20 }; 21 22 explicit Array(int size, const Type& v = Type()) : nelem(size) 23 { 24 vec = new Type[nelem]; 25 for(int i = 0; i < nelem; i++) 26 vec[i] = v; 27 } 28 29 Array(const Array<Type>& x) 30 { 31 if(&x == this) 32 { 33 nelem = 0; 34 vec = NULL; 35 } 36 else 37 { 38 nelem = x.nelem; 39 vec = new Type[nelem]; 40 for(int i = 0; i < nelem; i++) 41 vec[i] = x.vec[i]; 42 } 43 } 44 45 ~Array() { delete[] vec;} 46 47 int size() const { return nelem;}; 48 49 Array& operator=(const Array<Type>& x) 50 { 51 if(&x != this) 52 { 53 if(nelem != x.nelem) 54 { 55 delete[] vec; 56 nelem = x.nelem; 57 vec = new Type[nelem]; 58 } 59 for(int i = 0; i < nelem; i++) 60 vec[i] = x.vec[i]; 61 } 62 return *this; 63 } 64 65 Type& operator[](int i) 66 { 67 if(!is_valid_index(i)) 68 throw IdxRngErr(this,i); 69 return vec[i]; 70 } 71 72 const Type& operator[](int i) const 73 { 74 if(!is_valid_index(i)) 75 throw IdxRngErr(this,i); 76 return vec[i]; 77 } 78}; 79 80#endif 81

BoolArray.h

1#ifndef ____Bool 2#define ____Bool 3 4#include <limits> 5#include "Array.h" 6 7template <> class Array<bool> 8{ 9 typedef unsigned char BYTE; 10 static const int CHAR_BITS = std::numeric_limits<unsigned char>::digits; 11 12 int nelem; 13 int velem; 14 BYTE* vec; 15 16 static int size_of(int sz) { return (sz + CHAR_BITS - 1) / CHAR_BITS; } 17 18public: 19 20 class BitOfByteRef 21 { 22 BYTE& vec; 23 int idx; 24 25 public: 26 BitOfByteRef(BYTE& r, int i) : vec(r), idx(i) {} 27 28 operator bool() const { return (vec >> idx) & 1U; } 29 BitOfByteRef& operator=(bool b) 30 { 31 if(b) 32 vec |= 1U << idx; 33 34 else 35 vec &= ~(1U << idx); 36 37 return *this; 38 } 39 40 BitOfByteRef& operator=(BitOfByteRef& r) 41 { 42 return *this = (bool)r; 43 } 44}; 45 46 class IdxRngErr{ 47 const Array* ident; 48 int index; 49 50 public: 51 IdxRngErr(const Array* p, int i) : ident(p), index(i) {} 52 int Index() const { return index; } 53 }; 54 55 explicit Array(int sz, bool v = bool()) : nelem(sz), velem(size_of(sz)) 56 { 57 vec = new BYTE[velem]; 58 for(int i = 0; i < velem; i++) 59 vec[i] = v; 60 } 61 62 Array(const Array<bool>& x) 63 { 64 if(&x == this) 65 { 66 nelem = 0; 67 vec = NULL; 68 } 69 else 70 { 71 nelem = x.nelem; 72 velem = x.velem; 73 vec = new BYTE[velem]; 74 for(int i = 0; i < velem; i++) 75 vec[i] = x.vec[i]; 76 } 77 } 78 79 ~Array() { delete[] vec;} 80 81 int size() const { return nelem;}; 82 83 Array& operator=(const Array<bool>& x) 84 { 85 if(&x != this) 86 { 87 if(velem != x.velem) 88 { 89 delete[] vec; 90 velem = x.velem; 91 vec = new BYTE[velem]; 92 } 93 for(int i = 0; i < velem; i++) 94 vec[i] = x.vec[i]; 95 } 96 return *this; 97 } 98 99 BitOfByteRef operator[](int i) 100 { 101 if(i < 0 || i >= nelem) 102 throw IdxRngErr(this,i); 103 return BitOfByteRef(vec[i / CHAR_BITS], (i & (CHAR_BITS - 1))); 104 } 105 106 bool operator[](int i) const 107 { 108 if(i < 0 || i >= nelem) 109 throw IdxRngErr(this,i); 110 return (vec[i / CHAR_BITS] >> (i & (CHAR_BITS - 1)) & 1U) == 1; 111 } 112}; 113 114#endif 115

BoolArrayTest.cpp

1#include <iostream> 2#include "Array.h" 3#include "BoolArray.h" 4 5using namespace std; 6 7void print_Array_bool(const Array<bool>& a) 8{ 9 for(int i = 0; i < a.size(); i++) 10 cout << (a[i] ? '1' : '0'); 11} 12 13int main() 14{ 15 Array<bool> x(15); 16 17 cout << boolalpha; 18 for(int i = 0; i < x.size(); i++) 19 cout << "x[" << i << "] = " << x[i] << '\n'; 20 21 Array<bool> y(x); 22 23 Array<bool> z(5); 24 z = y; 25 26 y[3] = y[6] = true; 27 28 z[5] = z[12] = true; 29 30 cout << "x = "; print_Array_bool(x); cout << '\n'; 31 cout << "y = "; print_Array_bool(y); cout << '\n'; 32 cout << "z = "; print_Array_bool(z); cout << '\n'; 33} 34

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/04/04 06:10

> C++のコンパイル時に例外が コンパイル時ではなく実行時でしょう。
yu_89

2022/04/04 07:48

すみません。間違えました。実行時です。
guest

回答1

0

ベストアンサー

Array<bool>operator= の中で nelem をコピーし忘れているように見えます。

投稿2022/04/04 06:09

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_89

2022/04/04 07:51

ご回答いただき、ありがとうございます。 確かに、operator=内でnelemをコピーし忘れていました。 nelemをコピーするコードを入れたら解決することが出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問