DTKのSpriteBatch+unique_ptrをメンバ変数にすると怒られる

色々あってDTKを触っています。
とりあえずSpriteBatchを包んでオレオレクラス作ろうと思い、
以下のようなコードを書いていたところコンパイルエラーに。

しばらく悩んでいましたが、何やっても原因が分からないので、サークルメンバーに泣きついたところサクッと解決。

デフォルトコピーコンストラクタで、spriteがコピーされているのが原因かもと言われたので、
コピーコンストラクタをこっちで定義してやることに。

これで通りました。なるほどなあって感じです。
ちなみに、SpriteBatchのヘッダを見ると、コピー防止の為にコピーコンストラクタとoperator =が削除されていました。

コピー防止をする際は注意が必要ですね。気をつけます。

==

というわけで、SyntaxHighlightのテストも兼ねた備忘録でした。
こっちの方も増やしていきたいですね……

==
2017-06/27 public忘れ修正
2017-05/07 追記
未だにアクセスされる上に内容があやふやなので調べ直して追記。 あれから一杯お勉強しました。

代入演算子のオーバーロードを削除したクラスを所持するだけで、コンパイラは所持しているクラスの代入演算子も明示的に指定していない場合、削除する模様。

追記前は確かvs2013を使用していましたが、vs2017だとコンパイル時により詳細なメッセージを出力していました。(vs2013でも出てたのかな……?)


> error C2280: ‘Sprite &Sprite::operator =(const Sprite &)’: 削除された関数を参照しようとしています
> note: コンパイラが ‘Sprite::operator =’ をここに生成しました。
> note: ‘Sprite &Sprite::operator =(const Sprite &)’: 関数は、削除済みの、またはアクセスできない関数 ‘<不明>’ を <不明> が起動するため、暗黙的に削除されました
> note: ‘Hoge &Hoge::operator =(const Hoge &)’: 関数は明示的に削除されました


全てコンパイラメッセージの通りですが、要はコンパイル時にSpriteの代入演算子を暗黙的に生成しようとするものの、

Hogeは代入不可なのでコンパイラはSpriteの代入演算子もdeleteにしてしまい、結果としてmainのsprite = Sprite()がエラーとなります。

解決策としては
1. Spriteをコピーして使わない
2. Spriteに代入演算子を明示的に定義
3. Hogeの代入を許可する

そもそも設計が間違っているような…… わざわざコピー禁止にしているものをコピーしようとしているわけですし。

共有Tweet about this on TwitterShare on FacebookShare on Google+Share on Tumblr

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です