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

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

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

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

Q&A

解決済

1回答

2311閲覧

c++03の本でのコピーコンストラクタの例のコードがvs2019でエラー

Shion-Serizawa

総合スコア11

C++

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

0グッド

0クリップ

投稿2020/03/17 04:27

前提・実現したいこと

c++03(古いのを買ってしまっため)の独習c++という本で
コピーコンストラクタのところをやっているのですが
そこの例のソースコードをvisual studio 2019で
実行したところエラーが出てきてしまいました。

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

①array(←クラス名)があいまいです(コピーコンストラクタのクラス名のところ) ②オーバーロードされた関数"size"のどのインスタンスが対象であるかを特定できません。(コピーコンストラクタの中身) ③識別子"p"が定義されません。(コピーコンストラクタの中身) ④'array'はあいまいなシンボルです。(main関数でのarrayで宣言したところ)

おそらく②と③は①が原因だとは思っているのですが...

該当のソースコード

c++

1/* このプログラムでは「安全な」配列クラスを作成する 2 配列を記憶する領域を動的に割り当てるので、 3 配列オブジェクトを使用してほかの配列オブジェクトを 4 初期化する際に、コピーコンストラクタを使用して 5 メモリを割り当てる 6*/ 7#include <iostream> 8#include <cstdlib> 9using namespace std; 10 11class array { 12 int* p; 13 int size; 14public: 15 array(int sz) { // コンストラクタ 16 p = new int[sz]; 17 if (!p) exit(1); 18 size = sz; 19 cout << "「通常の」コンストラクタを使う\n"; 20 } 21 ~array() { delete[] p; } 22 23 // コピーコンストラクタ 24 array(const array& a); 25 26 void put(int i, int j) { 27 if (i >= 0 && i < size) p[i] = j; 28 } 29 int get(int i) { 30 return p[i]; 31 } 32}; 33 34/* コピーコンストラクタ 35 36 このコンストラクタでは、コピー用にメモリを割り当て、 37 このメモリのアドレスをpに割り当てる 38 したがって、pが元のオブジェクトと同じ動的割り当てメモリを 39 参照することはない 40*/ 41array::array(const array& a) { 42 int i; 43 44 size = a.size; 45 p = new int[a.size]; // コピー用のメモリを割り当てる 46 if (!p) exit(1); 47 for (i = 0; i < a.size; i++) p[i] = a.p[i]; // 内容をコピーする 48 cout << "コピーコンストラクタを使う\n"; 49} 50 51int main() 52{ 53 array num(10); // 「通常の」コンストラクタを呼び出す 54 int i; 55 56 // 配列に値を格納する 57 for (i = 0; i < 10; i++) num.put(i, i); 58 59 // numの内容を表示する 60 for (i = 9; i >= 0; i--) cout << num.get(i); 61 cout << "\n"; 62 63 // ほかの配列を作成し、numを使用して初期化する 64 array x = num; // コピーコンストラクタを呼び出す 65 66 // xを表示する 67 for (i = 0; i < 10; i++) cout << x.get(i); 68 cout << "\n"; 69 70 return 0; 71}

試したこと

コピーコンストラクタをインライン関数のようにしましたが、案の定main関数でエラーが残りました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

using namespace std;を外し
using std::cout;
にしてみるといいかと思います。

投稿2020/03/17 04:36

asm

総合スコア15147

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

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

asm

2020/03/17 04:37

エラーが出たところのarrayを::arrayにするのも方法ではあるが
Shion-Serizawa

2020/03/17 04:40

動きました!なんでエラーが出たのかはわかんないのでざっくり教えていただけると助かります。
asm

2020/03/17 05:01

C++11でstd::arrayというクラスが追加されたため コンパイラがどっちのarrayを指しているのか分からなくなっているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問