アプリ版:「スタンプのみでお礼する」機能のリリースについて

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();
}

A 回答 (5件)

こんにちわ



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

頑張ってください!

参考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

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

ので、わたしは 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

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

他の方と似たような回答になりますが、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

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


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

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

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

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