ページ 11

std::auto_ptrと不完全クラス

Posted: 2012年11月04日(日) 09:29
by YYSS
メンバ変数にstd::auto_ptrを使用し、ソースファイルの依存性を下げるために前方宣言だけで定義するようにしたのですが、
警告が出てしまいます・・・


warning C4150: 'C_Drawer' 型を削除するため delete 演算子が呼び出されましたが、定義がありません。


ソースは以下の通り

コード:

class	C_Drawer;

class C_ItemObj{

private:
	bool	m_Flag;
	const	std::auto_ptr< C_Drawer >		mc_Drawer;

	void	MoveProcess();
	void	CheckOverArea();
	void	FadeProcess();		//	回収された場合
	
public:
	C_ItemObj();

	//	初期化
	void	Init();

	//	生成時の初期化
	void	CreateInit( double x, double y, double ang, double sp, int color );

};
class C_Drawer; の変わりにヘッダーのインクルードをしてあげれば警告は消えるのですが、
ヘッダーの依存性が高まってしまいます。

ヘッダー内での別のヘッダーファイルのインクルードをあまりしたくないという、私の変な考えがいけないのかもしれませんが;;
依存性が低まれば、コンパイル時間が短くできるので、ただそれだけの理由なのですが;;


普通のポインタを使えば解決されるのですが、メモリリーク等を考えるとstd::auto_ptrを使いたいので、
解決法が分かる方はアドバイスを下さると幸いです。

Re: std::auto_ptrと不完全クラス

Posted: 2012年11月04日(日) 10:08
by h2so5
ここで同じ問題について解説されています。
http://www.akamoz.jp/you/uni/templ-dtor.htm

Re: std::auto_ptrと不完全クラス

Posted: 2012年11月04日(日) 10:15
by Suikaba
あと、std::auto_ptrはdeprecatedなので、使える環境ならstd::unique_ptr使いましょう。

Re: std::auto_ptrと不完全クラス

Posted: 2012年11月04日(日) 11:21
by YYSS
返答ありがとうございます。

調べたら、標準のshared_ptrを使えば動的削除子によって、
一切気にする必要がないということなのでそちらを利用したら解決しました。
http://site.oukasei.com/?p=139


あと、auto_ptrはdeprecatedというのは知りませんでした;;
Effective C++には書かれていなかったので、そのまま使おうとしていました;;
ご指摘ありがとうございます。