助言求む – プログラミング – Home

通知
すべてクリア

[解決済] 助言求む

固定ページ 1 / 5

ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
それができないんですよ・・他にやりかたが存在するのでしょうか?謎です・・


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

「それができないんですよ」だけじゃ「できるはずです、現に私はそうやってます。」と
しか言いようがありません。もっと詳しく説明してもらえませんか?

# 「使用上の注意」を熟読するのもいいかも。というか読んでくれ。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

確かに謎です!少なくとも私にはあなたに何が起こっているのか何も判りませんから

>他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
「他クラスに宣言したもの」とはクラスメンバーのことですか?
「->」や「.」やでアクセスするでしょうがポインターでは出来ないかもしれない

どんなクラスの何がアクセスしたいのでしょうか、アクセスし様とした場面がわかるような
サンプルを示して下さい。同時に、クラスの定義も教えてください。何が出来ないのかも
書いてくださいね


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
 

>他クラスで宣言した物に普通ポインタを使ってアクセスしますよね?
>それができないんですよ・・他にやりかたが存在するのでしょうか?謎です・・

Aクラス
 で宣言した「物」を
Bクラス
 でポインタを使ってアクセスしたい

1つのやり方として、
AクラスをBクラスが持っている状態にします。
Bクラスは、Aクラスのことを知っている(ヘッダーをインクルードしている)
状態です。
ポインタは、実体が存在しないといけないので、
Aクラスの「物」は、Bクラスができたときから、存在しないとだめです。
Aクラスの「物」は、外部からのアクセス制限を公(パブリック)に
しないと見ることができません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

お願いですからその謎なコードをみせてください。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

「それができないんですよ」をもう少し具体的に説明できるとよいのでは。
たとえば
・こんなクラスだけど、どう記述すればよいのか想像もつかない。
・記述してみたは良いが、どうしてもコンパイルエラーになる。
・実行してみると異常終了してしまう。
とか。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

まず、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がよめてないようです。
原因がつかめません。教えてください。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

new した CImage をどこかに保持してますか?
シリアライゼーションが終われば行方不明になってしまうのでは?


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

> CImage::~CImage()
> {
> delete header;
> delete pImage;
> }

は、以下のようにしないと、まずいのでは?
CImage::~CImage()
{
delete [] header;
delete [] pImage;
}

> CFile* fp = ar.GetFile();
arって何ですか? CArchiveですか?


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

はい、CArchiveです


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

>new した CImage をどこかに保持してますか?
>シリアライゼーションが終われば行方不明になってしまうのでは?

すいませんが、そのことについて詳しく教えてください


返信引用
euro2004
 euro2004
(@euro2004)
ゲスト
結合: 22年前
投稿: 37
 

関数内の内部変数に対し

int *hoge = new int;

とすると確かに領域は確保されますが
関数を抜けるとhogeは消滅するので
その領域がどこかわからなくなってしまう、
と言うことじゃないでしょうか?

#貯金してても通帳をどこにしまったか忘れたら
#そのお金は使えなくなりますよね?
#(ちょっとたとえが変かも^^;)


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

では、CImageへのポインタ *c_imageをつくり、c_image = new CImage();宣言ではそのクラ
スの中身すべて使えないのですか?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>まず、DocにクラスCImageへのポインタ *c_imageをつくり、
> c_image = new CImage();
このc_imageがどこで宣言されているかを教えてください。
.cppで、関数の中(例えばnewの直前)で宣言していますか?
それともどこか別の場所で宣言していますか?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

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 の指すものは
全て別の物になります。


返信引用
固定ページ 1 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました