人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【C++】コピーコンストラクタの自動生成について教えてください。

通常、あるクラスに対してコピーコンストラクタが定義されていない場合、コピーコンストラクタは必要に応じて自動生成されるものと思います。

しかし、必要なのにコピーコンストラクタを明示的に定義しておかないと自動生成が行われないケース(つまり、コンパイル時にコピーコンストラクタが見つからないというエラーが出る)があって、不思議に思っているのですが、そのような場合には一般的にどのようなケースが考えられるでしょうか?

なお、たとえば当該クラスの親クラスのコピーコンストラクタがprivateになっているような場合は、「コピーコンストラクタが見つからない」ではなく、「コピーコンストラクタにアクセスできない」というエラーになりますので、そのようなケースは除外してください。

また、コンパイラの設定で自動生成を禁止している、というケースも除外してください。

一応、当方のコンパイル環境はC++Builder5ですが一般的なC++の話で結構です。

●質問者: you1982
●カテゴリ:コンピュータ インターネット
✍キーワード:C++ C++Builder アクセス エラー クラス
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● しおり
●60ポイント ベストアンサー

ひとまず1例として見つけたのは、コピーコンストラクタへのアクセスが禁止されているクラスをメンバとして持つクラスが上記の例にあたるようです。

コピーコンストラクタの引数が const 参照になっていないという事はありませんか?

const を付けていないと、コンテナへの代入時にコピーコンストラクタが定義されていないというエラーになります。(Visual C++ 6.0)

◎質問者からの返答

ご回答、ありがとうございます。ただ、それはないと思います。

・・・と思ったのですが、全クラスメンバについてコピーコンストラクタを確認してみたところ、引数にconstを付け忘れているメンバクラスを発見しました・・・。全くお恥ずかしい話です。ご指摘、ありがとうございました。

今回の教訓として、コピーコンストラクタの自動生成が行われない場合は、メンバ中にコピーコンストラクタが適切に定義されていない(privateになっていたり、引数定義にconstがついていなかったりする)ものがある、ということですね。

親クラスのコピーコンストラクタが不適切な場合は、アクセスできない旨のエラーが出るため分かりやすいですが、メンバの定義が不適切な場合は要注意です。トホホ・・・。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ