アーカイブ関連と、CImage関連は全部無視でいいんじゃないか?
なんか変だよ。全体的な傾向が。
おっと・・・ヘッダ情報を読み込むのを忘れていました。
void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
if ( m_pImage != NULL )
{
delete m_pImage;
m_pImage = new CImage();
}
ar.Read(m_pImage->header,HEADER_SIZE);
ar.Read(m_pImage->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
}
}
もし、どうしてもファイルポインタを使いたいということであれば・・・
void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
if ( m_pImage != NULL )
{
delete m_pImage;
m_pImage = new CImage();
}
CFile* fp = ar.GetFile();
if( fp->GetLength() < HEADER_SIZE ) {
return;
}
fp->Seek( HEADER_SIZE, CFile::begin );
int i;
unsigned short *tmp;
for ( i=0, tmp=m_pImage->pImage;i<IMAGEDATA_SIZE; i++, tmp++) {
fp->Read(tmp,sizeof(unsigned short));
}
}
}
あ、そういえばC**Viewクラスからも使いたいとか言ってましたね。
そのときは
((C**Doc*)GetDocument())->m_pImage
と使ってください。そうすればC**ViewクラスからC**Docクラスの
publicなメンバが参照できますから。
あ、余分なお世話かもしれませんが使うときはNULLかどうか確認したほうが
いいですよ。
>あらかじめ、C**Docクラスにメンバー変数として、「CImage *m_pImage」をpublicで
>宣言しておきます。
>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます。
ここのところがよくわからないのですが、詳しく説明してもらえませんか?
なにがわからないのか具体的に示してください。
あなたの頭の中まで私たちは見ることができませんから。
すいません。せっぱ、つまってるもんで・・つい。
CImage *m_pImageはpublicで宣言したらエラーがでるのと、あと
>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます
これを書く場所と書き方がいまいち分かりません・・
m_pImage=NULL;
delete m_pImage;でいいのですか?
>すいません。せっぱ、つまってるもんで・・つい。
>CImage *m_pImageはpublicで宣言したらエラーがでるのと、あと
たぶん、CImageが定義されているであろうヘッダファイルをincludeしてない
からだと思います。
>>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます
>これを書く場所と書き方がいまいち分かりません・・
「コンストラクタとデストラクタという意味がまったくわかりません」
といっているみたいですがその認識で正しいですか?
>m_pImage=NULL;
こっちは正しいです。
>delete m_pImage;でいいのですか?
こっちは私が示したとおりのコーディングがされていません。
「・・・でなかったら」という文章を使っているので最低限「if」は必要なんじゃないですか?
>あらかじめ、C**Docクラスにメンバー変数として、
>「CImage *m_pImage」をpublicで宣言しておきます。
.hファイルで、
class C**Doc
{
public:
CImage *m_pImage;
}
とする、ということです。
>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
クラス名と関数名が同じもの、それがコンストラクタです。
C**Doc::C**Doc() という関数はあるんですよね? あなたが今変数宣言をしている関数で
す。そこで、
C**Doc::C**Doc()
{
m_pImage = NULL;
}
とする、ということです。
>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます。
「クラス名::~クラス名()」という関数、それがデストラクタです。そこで、
C**Doc::C**Doc()
{
if( m_pImage )
delete m_pImage;
}
とする、ということです。
基本的な語句の意味、変数のスコープなどについてもう一度おさらいすることを強くお勧
めします。
すいません。書く場所はわかります・・
C**Doc::C**Doc()
:m_pImage(NULL)
{
}
C**Doc::~C**Doc()
{
if(m_pImage) delete m_pImage;
}
ありがとうございます。やってみます。
CImageが定義されているヘッダファイルをincludeしているのですが、
// アトリビュート
public:
CImage *m_pImage;
こうすると、エラーが大量におきます・・
CImageが定義されているヘッダファイルの中身を全部表示してください。
たぶん、
#if !defined(_IMAGE_H_)
#define _IMAGE_H_
<CImageクラスが宣言されているところ>
#endif
これがないだけだと思いますが。
// image.h image class
#define HEADER_SIZE 7904
#define IMAGEDATA_SIZE 65536
ヘッダファイルはこうなっています・・
class CImage
{
public:
char *header;
unsigned short *pImage;
public:
CImage();
~CImage();
};