サーバー上からファイルをダウンロードするアプリを
作成しているものです。

ClassAとClassBが存在するとして、
ClassAでファイルをダウンロードする処理を記述し、
ClassBでプログレスバーを含むダイアログを作成しています。
ClassAのファイル読み込みのループ処理のカウンターを
プログレスバーのメンバー変数m_plgと同調させたい。

ClassA
 for(i=0;i<count;i++){
 }
ClassB
 m_plg.SetRange(0,count);
m_plg.SetPos(i);

かなり簡略化してます。
上記内容は実現可能だと思うのですが、メンバー変数の宣言部がおかしいのか
m_plgは宣言されていませんとエラーがでます。
メンバー変数の理解不足だと思うのですが、このような処理を行いたい場合は
どちらのClassにも認識されるようなコントロールのメンバー変数はどのようにして
宣言すればよろしいのでしょうか?

開発環境はVC++6.0 MFC ダイアログです。

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

A 回答 (2件)

VCは使ったことないんでプログレスバーを


表すクラスの名前が分からないので、ここでは
class ProgBarだとすると、class Bはこんな
感じですか?

class B {
public:
 B(){
  ...
  m_plg.SetRange(0, count);
  ...
 }
 ...
 ProgBar m_plg;
 ...
};

m_plgを直接class Aからいじろうと
思うなら、class Bの中でpublicフィールド
内で宣言しなければなりません。

で、class A内で、

class A {
 ...
 void report_progress(){
  for( int i = 0 ; i < 100 ; i++ ){
   ...
   dialogbox.m_plg.SetPos(i);
  }
 }
 ...
 B dialogbox;
 ...
};

てな感じのことをしたいんですかね。

だとすると、以上のプログラム例のように、
B内でm_plgをpublicで宣言し、A内で
Bのインスタンスを生成(または外部から
ポインタかリファレンスで受け取る)、
そのBのインスタンスからm_plgをメンバ参照する、
ということで良いと思いますが。
    • good
    • 0

簡略化というよりも、意図することが正確に伝わってきません。


クラスとインスタンスの関係について、少し調べられてはどうでしょう?

ClassB のインスタンスが Dialog だとしたら、ClassA 側から、Dialog.m_plg とアクセスすることはできます。もちろん public でなければなりません。
    • good
    • 0

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

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

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q※int nyuuryoku_kosuu = 0; ※の部分は何を宣言しているのでしょうか?

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
data [nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
 
以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d ...続きを読む

Aベストアンサー

※のところでnyuuryoku_kousuuの初期値を0と置くことで、data[nyuuryoku_kosuu]=kari_nyuuryoku;でkari_nyuuryokuの値をnyuuryoku_kosuuに正しく入れるための宣言だと思います

Q変数のない変数宣言(?)について

変数を指定せず、変数を宣言(?)するのは、C++言語の仕様として適切なものでしょうか。
言葉では説明しづらいので、例を示します。

Dataクラスを使用する場合、通常は

  Data data(100); // (1)

というように使用すると思いますが、これを

  Data(100); // (2)

と記述するのは、C++言語の仕様上、適切でしょうか。

また、(2)の記述方法は何か名称がありますか。

Aベストアンサー

ああそうそう,
Data(100)
のようにすると (実質的に) 「Data型の定数」というイメージだね. ちょうど
5
と書くと int型の定数になるのと同じようなものだと思えばいいよ.

Qこのプログラムを見てください(C言語) m( _ _ )m

現在乱数を使ったプログラムを作っています。

下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int ran, a=1, b, c;

void test(void){
b=8;
}
void main(){
srand(time(NULL));
a=b;//ここを無くすとなぜかエラーが出ない。
while(1){
ran=rand()%(a*2)+1;
switch(ran){
case 1: c=1; break;
case 2: c=1; break;
case 3: c=1; break;
case 4: c=2; break;
case 5: c=2; break;
case 6: c=3; break;
case 7: c=3; break;
case 8: c=4; break;
}
printf("%d",c);printf("何か押してください\n");getch();
}
}

現在乱数を使ったプログラムを作っています。

下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int ran, a=1, b, c;

void test(void){
b=8;
}
void main(){
srand(time(NULL));
a=b;//ここを無く...続きを読む

Aベストアンサー

a=b

の実行時に変数bが参照されますが、

値が不定です。

test()がa=b以前に実行されていればOKです。

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html


人気Q&Aランキング

おすすめ情報