他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
それができないんですよ・・他にやりかたが存在するのでしょうか?謎です・・
「それができないんですよ」だけじゃ「できるはずです、現に私はそうやってます。」と
しか言いようがありません。もっと詳しく説明してもらえませんか?
# 「使用上の注意」を熟読するのもいいかも。というか読んでくれ。
確かに謎です!少なくとも私にはあなたに何が起こっているのか何も判りませんから
>他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
「他クラスに宣言したもの」とはクラスメンバーのことですか?
「->」や「.」やでアクセスするでしょうがポインターでは出来ないかもしれない
どんなクラスの何がアクセスしたいのでしょうか、アクセスし様とした場面がわかるような
サンプルを示して下さい。同時に、クラスの定義も教えてください。何が出来ないのかも
書いてくださいね
>他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
>それができないんですよ・・他にやりかたが存在するのでしょうか?謎です・・
Aクラス
で宣言した「物」を
Bクラス
でポインタを使ってアクセスしたい
1つのやり方として、
AクラスをBクラスが持っている状態にします。
Bクラスは、Aクラスのことを知っている(ヘッダーをインクルードしている)
状態です。
ポインタは、実体が存在しないといけないので、
Aクラスの「物」は、Bクラスができたときから、存在しないとだめです。
Aクラスの「物」は、外部からのアクセス制限を公(パブリック)に
しないと見ることができません。
お願いですからその謎なコードをみせてください。
「それができないんですよ」をもう少し具体的に説明できるとよいのでは。
たとえば
・こんなクラスだけど、どう記述すればよいのか想像もつかない。
・記述してみたは良いが、どうしてもコンパイルエラーになる。
・実行してみると異常終了してしまう。
とか。
まず、DocにクラスCImageへのポインタ *c_imageをつくり、シリアライゼーションにファイ
ル読出しを行いました。それが次のです。
c_image = new CImage();
// c_image->CImage();
CFile* fp = ar.GetFile();
filePath = fp -> GetFilePath();
if( fp->GetLength() < HEADER_SIZE ) {
return;
}
fp->Seek( HEADER_SIZE, CFile::begin );
int i;
unsigned short *tmp;
tmp = c_image->pImage;
for ( i=0; i<HEADER_SIZE; i++, tmp++) {
fp->Read( tmp, sizeof( unsigned short ) );
}
}
}
そしてクラスCImageには
class CImage
{
public:
char *header;
unsigned short *pImage;
public:
CImage();
~CImage();
};
#include stdafx.h
#include image.h
CImage::CImage()
{
header= new char[HEADER_SIZE];
pImage = new unsigned short[IMAGEDATA_SIZE];
}
CImage::~CImage()
{
delete header;
delete pImage;
}
となっています。IMAGEDATA_SIZEは256*256でDocで宣言しています。
pImageにファイルで読み込んだものを格納したいのですが、pImageがよめてないようです。
原因がつかめません。教えてください。
new した CImage をどこかに保持してますか?
シリアライゼーションが終われば行方不明になってしまうのでは?
> CImage::~CImage()
> {
> delete header;
> delete pImage;
> }
は、以下のようにしないと、まずいのでは?
CImage::~CImage()
{
delete [] header;
delete [] pImage;
}
> CFile* fp = ar.GetFile();
arって何ですか? CArchiveですか?
はい、CArchiveです
>new した CImage をどこかに保持してますか?
>シリアライゼーションが終われば行方不明になってしまうのでは?
すいませんが、そのことについて詳しく教えてください
関数内の内部変数に対し
int *hoge = new int;
とすると確かに領域は確保されますが
関数を抜けるとhogeは消滅するので
その領域がどこかわからなくなってしまう、
と言うことじゃないでしょうか?
#貯金してても通帳をどこにしまったか忘れたら
#そのお金は使えなくなりますよね?
#(ちょっとたとえが変かも^^;)
では、CImageへのポインタ *c_imageをつくり、c_image = new CImage();宣言ではそのクラ
スの中身すべて使えないのですか?
>まず、DocにクラスCImageへのポインタ *c_imageをつくり、
> c_image = new CImage();
このc_imageがどこで宣言されているかを教えてください。
.cppで、関数の中(例えばnewの直前)で宣言していますか?
それともどこか別の場所で宣言していますか?
class CImage { ... };
void Foo {
CImage cimage0;
}
void Hoo {
CImage cimage1;
}
void Boo {
CImage* pcimage0 = new CImage;
}
void Moo {
CImage* pcimage1 = new CImage;
}
CImage cimage2;
こう書いた場合、cimage0,cimage1,*pcimage0,*pcimage1,cimage2 の指すものは
全て別の物になります。