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();
}
No.1
- 回答日時:
こんにちわ
以前にも似たような質問があり、僕も回答させてもらいましたので、
それを紹介しておきます。
頑張ってください!
参考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();
}
No.2
- 回答日時:
私もあまり詳しくはないのですが、確か出来なかったと思います。
ので、わたしは 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);
ってな具合ですが、どうでしょう?
No.3
- 回答日時:
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();
}
No.4
- 回答日時:
他の方と似たような回答になりますが、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 さんの回答にあるように
コンストラクタで関連を持たせるようにする方が良いです。
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();
}
で実装しました。
No.5ベストアンサー
- 回答日時:
>ゆえにclsAのコンストラクタを細工するのは避けたい。
clsBのコンストラクタですよね?
>また、clsBがclsAの寿命中に常に常駐するのは避けたい。
vfFuncA()のメソッド中に clsBを宣言しているので、vfFuncAの実行時に clsBはスタックに実体がとられ、vfFuncA終了と共に解放されるので常にメモリをとられているわけではありません。
>がてるのです。何処が悪いの?
clsBの構造を先に定義しないとだめなんじゃないでしょうか。
また、以下のコードは、
void vfFuncB(clsA* oB){
oB.vfSet(123);
};
ポインタで渡されているから、oB->vfSet(123); ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
LEDで電光掲示板に「A B C D E...
-
(void)0 はどんな意味ですか
-
bccでエラー:メンバー関数は呼...
-
C++にてtemplateで受け取った任...
-
PICのシリアル通信について
-
ArduinoでMouse関数を使用して...
-
4桁7セグでダイナミック点灯
-
void*型の配列について
-
_beginthread()の使用について
-
関数の戻り値がextern
-
Notepad++の関数リスト表示の変...
-
マイナスからプラスへ転じた時...
-
fgetsなどのときのstdinのバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
静的でないメンバ関数の呼び出...
-
gcc: incompatible pointer type
-
C# Controls.Addで動的に配置し...
-
int main()、void main()、void...
-
(void)0 はどんな意味ですか
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
C# KeyDownイベントでショート...
-
const_castのつかいどころを教...
-
H8マイコンのシリアル通信につ...
-
コールバックって・・・
-
関数ポインタについて
-
void main()って誰が最初?:AN...
おすすめ情報