質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

2104閲覧

Visual C++のMFCのダイアログベースでクラスの中に存在する変数の値を、別のファイルに書かれている外部関数で参照する方法が分からない

tada_tadaa

総合スコア113

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2021/03/21 01:34

Visual C++2002のMFCのダイアログベースで作業をしているのですが、クラスの中に存在する変数の値を、別のファイルに書かれている外部関数で参照する方法が分かりません。

プロジェクト内のソースファイルとヘッダーファイルは次のような構成になっています。

ソースファイル
テスト.cpp
テストDlg.cpp
stdafx.cpp
test.cpp

ヘッダーファイル
テスト.h
テストDlg.h
stdafx.h
Resource.h

フォーム上にはボタンが2個置いてあります。
CMyDlgに変数の追加で、cntというint型の変数を追加します。
ShowFunc(void)という関数を追加して変数cntの値を返すようにします。

cpp

1int CMyDlg::ShowFunc(void) 2{ 3 return cnt; 4}

ボタン1を押したら次の関数が実行されます。

cpp

1void CMyDlg::OnBnClickedButton1() 2{ 3 int num = ShowFunc(); 4 char str[10]; 5 itoa(num, str, 10); 6 MessageBox(str, "cntの値", MB_OK); 7 cnt2 = num; // cnt2はグローバル変数でテストDlg.cppの上のほうで宣言されている 8}

ボタン2を押したら次の関数が実行されます。

cpp

1void CMyDlg::OnBnClickedButton2() 2{ 3 func(); 4}

func関数は自分で追加したtest.cppに記入してあります。

cpp

1#pragma once 2#include "stdafx.h" 3#include "テスト.h" 4#include "テストDlg.h" 5extern int cnt2; 6void func() 7{ 8 //int num = CMyDlg::ShowFunc(); 9 //int num = CMyDlg::cnt; 10 int num = cnt2; 11 12 char str[10]; 13 itoa(num, str, 10); 14 MessageBox(NULL, str, "func関数のcntの値", MB_OK); 15}

変数cntはBOOL CMyDlg::OnInitDialog()でフォームの初期化の段階で数値99を代入してあります。
ボタン1を押すと99と書かれたメッセージボックスが表示されます。
ボタン1を押した後ボタン2を押しても99と表示されます。それはボタン1を押したときにグローバル変数cnt2に代入作業を行っているからです。

僕が質問したいのは、このグローバル変数を使わないでtest.cppに書かれてあるfunc関数で、CMyDlgの変数cntを参照する方法を知りたいと思っています。
func関数内で次のように宣言してもエラーになります。
int num = CMyDlg::cnt;
test.cpp(13): error C2597: 静的でないメンバ 'CMyDlg::cnt' への参照が正しくありません。
とエラーが出ます。

グローバル変数に一回一回クラスの変数の値を代入してたら面倒です。グローバル変数を使わずに別のファイルからクラス内の変数を参照する方法をご存知の方は教えてください。あるいはクラスを丸ごと、グローバル変数に代入して、一回の代入で、別のファイルでもそのクラスを使う方法のようなものはないのでしょうか?(意味が分からなかったらすみません)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++

1void CMyDlg::OnBnClickedButton2() 2{ 3 func(this); 4}

んでもって

C++

1void func(CMyDlg* dlg) 2{ 3 int num = dlg->ShowFunc(); 4 5 char str[10]; 6 itoa(num, str, 10); 7 MessageBox(NULL, str, "func関数のcntの値", MB_OK); 8}

投稿2021/03/21 01:40

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2021/03/21 01:49

回答ありがとうございます。上記の方法を試したところうまく出来ました。関数にクラスを渡すのは思いつきませんでした。 どうもありがとうございました。
episteme

2021/03/21 03:54

funcがCMyDlgを欲しがってるんだから渡してあげればいいじゃない、ってゆー単純/愚直なコト。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問