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

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

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

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

解決済

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

yu_89
yu_89

総合スコア27

C++

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

1回答

0評価

0クリップ

265閲覧

投稿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

#ifndef ___Array #define ___Array template <class Type> class Array { int nelem; Type* vec; bool is_valid_index(int idx) { return idx >= 0 && idx < nelem; } public: class IdxRngErr{ const Array* ident; int idx; public: IdxRngErr(const Array* p, int i) : ident(p), idx(i) {} int Index() const { return idx; } }; explicit Array(int size, const Type& v = Type()) : nelem(size) { vec = new Type[nelem]; for(int i = 0; i < nelem; i++) vec[i] = v; } Array(const Array<Type>& x) { if(&x == this) { nelem = 0; vec = NULL; } else { nelem = x.nelem; vec = new Type[nelem]; for(int i = 0; i < nelem; i++) vec[i] = x.vec[i]; } } ~Array() { delete[] vec;} int size() const { return nelem;}; Array& operator=(const Array<Type>& x) { if(&x != this) { if(nelem != x.nelem) { delete[] vec; nelem = x.nelem; vec = new Type[nelem]; } for(int i = 0; i < nelem; i++) vec[i] = x.vec[i]; } return *this; } Type& operator[](int i) { if(!is_valid_index(i)) throw IdxRngErr(this,i); return vec[i]; } const Type& operator[](int i) const { if(!is_valid_index(i)) throw IdxRngErr(this,i); return vec[i]; } }; #endif

BoolArray.h

#ifndef ____Bool #define ____Bool #include <limits> #include "Array.h" template <> class Array<bool> { typedef unsigned char BYTE; static const int CHAR_BITS = std::numeric_limits<unsigned char>::digits; int nelem; int velem; BYTE* vec; static int size_of(int sz) { return (sz + CHAR_BITS - 1) / CHAR_BITS; } public: class BitOfByteRef { BYTE& vec; int idx; public: BitOfByteRef(BYTE& r, int i) : vec(r), idx(i) {} operator bool() const { return (vec >> idx) & 1U; } BitOfByteRef& operator=(bool b) { if(b) vec |= 1U << idx; else vec &= ~(1U << idx); return *this; } BitOfByteRef& operator=(BitOfByteRef& r) { return *this = (bool)r; } }; class IdxRngErr{ const Array* ident; int index; public: IdxRngErr(const Array* p, int i) : ident(p), index(i) {} int Index() const { return index; } }; explicit Array(int sz, bool v = bool()) : nelem(sz), velem(size_of(sz)) { vec = new BYTE[velem]; for(int i = 0; i < velem; i++) vec[i] = v; } Array(const Array<bool>& x) { if(&x == this) { nelem = 0; vec = NULL; } else { nelem = x.nelem; velem = x.velem; vec = new BYTE[velem]; for(int i = 0; i < velem; i++) vec[i] = x.vec[i]; } } ~Array() { delete[] vec;} int size() const { return nelem;}; Array& operator=(const Array<bool>& x) { if(&x != this) { if(velem != x.velem) { delete[] vec; velem = x.velem; vec = new BYTE[velem]; } for(int i = 0; i < velem; i++) vec[i] = x.vec[i]; } return *this; } BitOfByteRef operator[](int i) { if(i < 0 || i >= nelem) throw IdxRngErr(this,i); return BitOfByteRef(vec[i / CHAR_BITS], (i & (CHAR_BITS - 1))); } bool operator[](int i) const { if(i < 0 || i >= nelem) throw IdxRngErr(this,i); return (vec[i / CHAR_BITS] >> (i & (CHAR_BITS - 1)) & 1U) == 1; } }; #endif

BoolArrayTest.cpp

#include <iostream> #include "Array.h" #include "BoolArray.h" using namespace std; void print_Array_bool(const Array<bool>& a) { for(int i = 0; i < a.size(); i++) cout << (a[i] ? '1' : '0'); } int main() { Array<bool> x(15); cout << boolalpha; for(int i = 0; i < x.size(); i++) cout << "x[" << i << "] = " << x[i] << '\n'; Array<bool> y(x); Array<bool> z(5); z = y; y[3] = y[6] = true; z[5] = z[12] = true; cout << "x = "; print_Array_bool(x); cout << '\n'; cout << "y = "; print_Array_bool(y); cout << '\n'; cout << "z = "; print_Array_bool(z); cout << '\n'; }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

int32_t

2022/04/04 06:10

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

2022/04/04 07:48

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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