clsB::vfFuncB関数ないで
clsA::lVarAにアクセスする方法がありましたら
教えて下さい。

#include <stdio.h>

class clsB{
public:
clsB(){};
~clsB(){};
void vfFuncB(){
printf("clsB::vfFuncB\n");
printf("clsA::lVarAをアクセスしたい\n");
};
};

class clsA{
public:
clsA(){};
~clsA(){};
void vfFuncA(void){
clsB oB;
oB.vfFuncB();
};
void vfSet(long lA){lVarA=lA;}
long lfGet(void) {return lVarA;}
private:
long lVarA;
};

void main(void)
{
clsA oA;
oA.vfFuncA();
}

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>ゆえにclsAのコンストラクタを細工するのは避けたい。


clsBのコンストラクタですよね?

>また、clsBがclsAの寿命中に常に常駐するのは避けたい。
vfFuncA()のメソッド中に clsBを宣言しているので、vfFuncAの実行時に clsBはスタックに実体がとられ、vfFuncA終了と共に解放されるので常にメモリをとられているわけではありません。

>がてるのです。何処が悪いの?
clsBの構造を先に定義しないとだめなんじゃないでしょうか。
また、以下のコードは、
 void vfFuncB(clsA* oB){
  oB.vfSet(123);
 };
ポインタで渡されているから、oB->vfSet(123); ですね。
    • good
    • 0

他の方と似たような回答になりますが、clsA と clsB の関係が、vfFuncA() を


呼ぶ間だけの、「疎」な関係に有るのであれば、clsA.vfFuncA() で、clsB.vfFuncB() を
呼ぶときに、自分( clsA のオブジェクト)を渡すようにする方が良いでしょう。

class clsB {
 …
 void vfFuncB(clsA* a); /* メソッドの定義は後で */
{
  printf("clsA::lVarA is %ld\n", a.lfGet());
 }
};

class clsA {
 …
 void vfFuncA(void) {
  clsB oB;
  oB.vfFuncB(this);
 }
};

void clsB::vfFuncB(clsA* a)
{
 printf("clsA::lVarA is %ld\n", a.lfGet());
}

clsA と clsB の関係が「密」であるならば、yatokesa さんの回答にあるように
コンストラクタで関連を持たせるようにする方が良いです。
    • good
    • 0
この回答へのお礼

class A {
public:
void f(){B b; b.f(this)};
void set(long x){v=x;}
private:
long v;
};

class B {
public:
void f(A* a) {
a->set(123);
}
};

void main() {
A a;
a.f();
}
で実装しました。

お礼日時:2001/09/18 17:01

vf が virtual function のような気がしたので、私は継承について少し。



class clsA {
protected:
 long lVarA;
public:
 virtual void vfFunc() {
  「clsAの処理」;
 }
};

class clsB : public clsA { // clsBはclsAの機能を拡張する
public:
 void vfFunc() {
  clsA::vfFunc(); // まず、clsAとしての処理を行う
  「clsBの追加処理、lVarAもアクセスできる」;
 }
};

void main()
{
 clsA oA; clsB oB;
 oA.vFunc();
 oB.vFunc();
}
    • good
    • 0

私もあまり詳しくはないのですが、確か出来なかったと思います。

ので、わたしは clsBを生成するときに clsAを渡し、clsBのコンストラクタの中でメンバー変数に保存するようにしています。

class clsB{
public:
 clsB(clsA* pA){m_pA = pA};
 ~clsB(){};
 void vfFuncB(){
  printf("clsB::vfFuncB\n");
  printf("clsA::lVarAをアクセスしたい\n");
 };
private:
 m_pA;
};

クラス生成時
clsB oB(this);

ってな具合ですが、どうでしょう?
    • good
    • 0

こんにちわ



以前にも似たような質問があり、僕も回答させてもらいましたので、
それを紹介しておきます。

頑張ってください!

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=109273

この回答への補足

実際にはclsAはATLのCOMのメソッドです。
ゆえにclsAのコンストラクタを細工するのは避けたい。
また、clsBがclsAの寿命中に常に常駐するのは避けたい。

ところで
(10) : error C2079: 'oB' が 未定義の class 'clsB' で使用されています。
(11) : error C2228: '.vfFuncB' : 左側がクラス、構造体、共用体ではありません。
がてるのです。何処が悪いの?

#include <stdio.h>

class clsB;
class clsA{
friend class clsB;
public:
 clsA(){};
 ~clsA(){};
 void vfFuncA(){
  clsB oB;
  oB.vfFuncB(this);
 }
 void vfSet(long lA){lVarA=lA;}
 long lfGet(void) {return lVarA;}
private:
 long lVarA;
};

class clsB{
public:
 clsB(){};
 ~clsB(){};
 void vfFuncB(clsA* oB){
  oB.vfSet(123);
 };
};

// COMの呼び出し側はclsBの存在を知らない。
void main(void)
{
 clsA oA;
 oA.vfFuncA();
}

補足日時:2001/09/18 15:11
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q日本円と人民元はレートの交換?はしていないのでしょうか?

いまいち為替の仕組みがよくわかっていませんが
http://www.gaitame.com/market/chart/usd_1.html
を見て思ったのですが
日本と中国では通貨の交換(この表現で合ってるか自信ないです)はしていないのでしょうか?
たまたま外為どっとコムがしていないだけなのでしょうか?

Aベストアンサー

日本円(JPY) から 中国 元(CNY) 為替レート2009 年 05 月 09 日
1 日本円 = 0.0693 中国 元
http://www.zzrate.com/rates/jpy/cny/1/

参考URL:http://www.zzrate.com/rates/jpy/cny/1/

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Q人民元,ドル,円の為替関係の中で 円の損益分岐点は

7月13日現在
通貨種類   人民元   米ドル    日本円
人民元    1      8.277   0.07608
CNY 米ドル 0.1208     1     0.009192
USD 日本円  13.14    108.8     1
と なっていますが
人民元とドルの為替レートは固定されてますよね
円のレートで人民元に換金する時,いくらのレートまでだったら円が得でいくら以上だとドルが得か
計算書式もわからず 円の損益分岐教えてください。

Aベストアンサー

損益はありません。

利益の出る組み合わせがあったとしましょう。
すると、世界中の金融機関で為替レートの変動を監視しているコンピュータが
瞬時にそれを見つけ出し、資金を移動させようとします。相対的に高い通貨の
レートは下がり、安い通貨のレートは上がります。結果として、為替レートに
よる損益は解消されてしまうのです。

もちろん、通時的な変動によって差益を得ようとするのであれば、一応可能です。
安い時に買った通貨を高い時に売れば差益は出ます。ただ、相対的なものですので、
いくら以上なら得と言うことはできません。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Q円・ドル・元の関係について

最近、また人民元切り上げの話題が盛り上がってきましたね。外国為替証拠金取引でも人民元を取り扱っている業者もあるようです。個人でも切り上げで恩恵を受けることができないか考えています。

そこで質問です。

1.ドル/円レート 106.85円
2. 元/円レート  12.91円
3.ドル/元レート 8.2764元

上のレートで、1=2×3という式がおおよそ成り立ちます。

元が通貨バスケット制だか変動相場制だかに移行したら、3の値が小さくなるというのはわかるのですが、2の値はどうなるのでしょうか。元/円も変動相場制になるのでしょうか?この式がどのように変わっていくことが予想されるのか知りたいのです。

Aベストアンサー

1=2x3という式は不変で、いつの場合でも成立します。もし、ここから大きく外れると、無リスクの裁定取引ができるので為替ディーラーたちが取引を開始し、1=2x3に収束するようになります。

変動相場制に移行した場合でも、1=2×3は不変なので、2は3が大きくなるにつれ小さくなります。元が円に対しても強くなるわけです。

人民元がドルに対して強くなるだろうというのは確からしいとしても、それに向かう過程は一筋縄ではいかないのではと考えています。投機筋の大量の人民元買いや香港ドル買いが起こったら中国当局はどうするのでしょうかね。何らかの移行措置を考えないと、危険なことになると考えるはずでしょう。通貨バスケット制の場合は、人民元は切りあがるわけではないので、この方法を選択するのでしょうか。

私は、先行きがあまりにも不透明なので、やはり通貨それ自体に対する投資は控えたいと思っています。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q中国で日本円を人民元に両替

中国で日本円を人民元に両替をしたいと思います。
10万円以下ですが、どういった方法が一番良いレートで両替できるでしょうか?
闇両替はつかいません。

中国の銀行は日本円現金を両替する場合1万円ごとに10元以上の手数料が付くと聞いたのですが本当なのでしょうか?

以前中国でPLUSのついている国際カードで、ATMで日本の普通預金を引き落としいましたが1回の手数料日本円200円かかりますが、この手数料も加算して実際PLUSの換金レートはいかがなものなのでしょうか?とても便利で中国にいるときはよく利用してしまうのですが。。。。

やはりカードを利用するより銀行の窓口で両替した方が良いレートなのでしょうか?

よろしくお願いします。

Aベストアンサー

1万円あたり手数料が10元というのは聞いたことがありませんが、為替レートに対して通貨売りTTSと通貨買いTTBのレートが設定されているという話でしょうか。
実際、外貨から中国元に両替する場合、銀行口座に預金されている外貨から両替する場合と、外貨現金から両替する場合では、適用されるレートが異なります。
http://www.boc.cn/sourcedb/whpj/
は中国銀行の為替レート一覧です。現鈔が現金の場合のレートです。日本円(日元)の現金を中国元に両替する場合のレートは左から2列目のレートが適用されます。日本円の場合は100円を交換した場合に得られる中国元の額になっていますので、1万円を両替するとこの表の数字の100倍の額が手に入ります。(今だとおよそ600中国元です。)
日本の銀行で両替すると1中国元あたり1.5円ほどの手数料に相当するので、現地の銀行で両替するのが一番有利だと思います。

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Q上海空港で円を元に両替し、帰りに上海か成田で元を円に両替しようと思います。

レートが20円/元とすると、10000円は何元の手取りになり①、全く使わず円に戻すと何円になるのでしょうか②?両替できる単位はどれほどでしょうか③。元は何元札を持てば一番便利でしょうか④?注意すべきこと、有利になることなど何でも教えてください⑤.海外は初めてです。

Aベストアンサー

① 国際線出口の両替所では両替1回毎に手数料60元を必要としますから、元買い為替レート20円=1元ならば、(10,000÷20)-60=540元となります。なお両替レート自体が中国銀行公定レートより悪いです。
② 中国内での再両替は6か月内の両替証明書金額の1/2までです。たとえ両替した元を全額使用しなくとも、この制限にかかり全額再両替は出来ません。なお、公式レートでは元売りの為替レートは元買いの為替レートより約0.5%低くなります。これが手数料になります。
③ 両替は通貨である紙幣単位です。円は千円から、元は1元からです。
④ 円から元への両替では100元札が基本です。スーパーやコンビニでは問題なく100元札で買い物できますから、そう気にする必要はありません。ただ、市内バスに頻繁に乗るなら、交通カード無しの場合、中国では無人バスではお釣りが出ませんから、運賃の1元札か硬貨を持つ必要があります。
⑤ 基軸通貨である米ドル・ユーロを除くと、現地両替が原則です。日本では10%以上レートが悪いのが一般的です。もし中国内での両替でしたら、市中の中国銀行での両替レートは公定レートで空港のような手数料無しなので問題ありませんが、場所探しと時間がかかります。

① 国際線出口の両替所では両替1回毎に手数料60元を必要としますから、元買い為替レート20円=1元ならば、(10,000÷20)-60=540元となります。なお両替レート自体が中国銀行公定レートより悪いです。
② 中国内での再両替は6か月内の両替証明書金額の1/2までです。たとえ両替した元を全額使用しなくとも、この制限にかかり全額再両替は出来ません。なお、公式レートでは元売りの為替レートは元買いの為替レートより約0.5%低くなります。これが手数料になります。
③ 両替は通貨である紙幣単位です。円は...続きを読む

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む


人気Q&Aランキング