No.6ベストアンサー
- 回答日時:
// M.h
class M {
private:
int xxx;
public:
void setXXX(int v) { xxx = v; }
int getXXX() const { return xxx; }
...
};
// C.cpp
#include "M.h"
#include "C.h"
void C::function() {
M* m = static_cast<M*>(GetParentFrame());
m->setXXX(123); // write
int xxx = mf->getXXX(); // read
}
昔のPCが生きていたので確認できました。
何度も有難う御座います。
先回うまく行かなかったのは、
#include "M.h"
が抜けていたためでした。
(ケアレスミスでは有りません。このようにしなければいけない事を知らなかっただけです。またひとつ勉強になりました)
今回のやり方でコンパイルエラーは出ませんでしたが、実行時に”不正な処理~”が出てしまいました。
自分で、もう少し考えてみます。
No.10
- 回答日時:
> 出来ました。
とうとう出来ました。めでたし。グローバル変数こねくりまわすよか綺麗でしょ?
> でも待てよ、親フレームのサイズはどうすればxxxに代入出来るんだ?
xxxへ代入できるのが親フレーム本人に限られるのなら、setXXXはprivate部に置いて外から使えなくするが吉でしょう。
epistemeさん 今回の件、本当にありがとうございました。
でもこんなに大変(?)と言うことは、起動時のフレームサイズに対して、ある大きさの子ウィンドウを開くなんてことは普通しないってことなのかなぁ・・
No.9
- 回答日時:
# 何度もごめんなさい
> #3 にあるように、CWinAppに持たせてはいかがでしょう。
これ、やっぱり気に入らない。CWinAppには必要のないものなんだから。
AfxGetMainWnd() でMDI-親フレームが得られるはず。
こちらがbetterかな...
出来ました。とうとう出来ました。(以下にて)
CMainFrame* m = static_cast<CMainFrame*>(GetMDIFrame());
epistemeさん。最後まで付き合ってくださり本当にありがとうございました。
でも待てよ、親フレームのサイズはどうすればxxxに代入出来るんだ?だめだ、でもこれ以上聞けない。
てことで悩んだ末、ようやくできました。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
省略
setXXX(yyy); // write
}
再度、ありがとうございました。
No.8
- 回答日時:
うぅぅ...PreCreateWindow中はまだWidnowが世の中に存在しないわけで、
そうなるとGetMDIFrameの類がちゃんと動いてくれるか怪しいす。(0が返っているかも)
#3 にあるように、CWinAppに持たせてはいかがでしょう。
No.7
- 回答日時:
> 今回のやり方でコンパイルエラーは出ませんでしたが、実行時に”不正な処理~”が出てしまいました。
あ、もしかしたら GetParentFrame() 改め GetMDIFrame() かも。
この回答への補足
慌てて間違えました。
元々やりたかったのは、
1.MDIにて起動時に開く子ウインドウのサイズを”フレーム”の半分の大きさにする
2.そのために、”フレーム”のCS.CXを取得し、子ウインドウのサイズCS.CX/2を使用する
と言うものです。
朝起きて覗いてみたら、やった~~。またまた返信が来てるではないですか。恐る恐る実行ボタンをクリックなんとなくうまく行きそう。と思ったら、英文のエラーメッセージが出てしまいました。
無視、中止、再試行と書いてあるやつ。
そもそも、私は皆さんに対し、どこにどう書いたか示していないじゃないですか。大変失礼しました。
元々やりたかったのは、
1.MDIにて子ウインドウを起動時に2個表示
2.1個目はCS.CXにて任意の大きさや最大表示にする
3.2個目は、1個目の半分の大きさにする
そのために1個目のCS.CXを取得し、CS.CX/2を使用
と言うものです。
コードは以下です。
// MainFrm.h : CMainFrame クラスの宣言およびインターフェイスの定義をします。
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_MAINFRM_H__15A05C09_541B_11D7_AAAB_00094100E775__INCLUDED_)
#define AFX_MAINFRM_H__15A05C09_541B_11D7_AAAB_00094100E775__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMainFrame : public CMDIFrameWnd
{
//■ここから追加
int xxx;
public:
void setXXX(int v) { xxx = v; }
int getXXX() const { return xxx; }
//■ここまで追加
// ChildFrm.cpp : CChildFrame クラスの動作の定義を行います。
//
#include "stdafx.h"
#include "1234.h"
#include "MainFrm.h"//■これを追加
#include "ChildFrm.h"
/////////////////////////////////////////////////////////////////////////////
// CChildFrame クラスの構築/消滅
CChildFrame::CChildFrame()
{
// TODO: メンバ初期化コードをこの位置に追加してください。
}
CChildFrame::~CChildFrame()
{
}
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs の設定を行って、Window クラスまたは
// スタイルを変更してください。
//■ここから追加
CMainFrame* m = static_cast<CMainFrame*>(GetMDIFrame());
m->setXXX(123); // write
int xxx = m->getXXX(); // read
//■ここまで追加
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
No.5
- 回答日時:
前述の方達の意見を見て書いています。
まだ、VC++というかC++の勉強の最中なので間違った使用法かもしれないのでご自分で一応調べてみてください。
「グローバル変数は危険なのでやめましょう」とよく聞く、もしくは、書いてありましたが、同様の状況におちいった時、グローバル変数を使ってしまいます。但し、ネームスペース定義を行います。
namespace ネームスペース名 {
ネームスペースに所属する宣言と定義・・・(1)
}
(1)の部分で定義した識別子にはネームスペースの外側からは認識できなくなります(こうやってスコープを限定してやる)。
で、実際に使用する時は "ネームスペース名::(1)の識別子"でスコープを解決してやる。
※本来のネームスペースの使い方でないのかもしれませんので、くどいようですが、ご自分で調べてみてください。
No.4
- 回答日時:
> でも残念ながらグローバル変数を使わないときは、どうすれば良いかが分かりません。
> と言うか、分からないからグローバル変数を使おうとしたのですが・・・
たとえば:
- MainForm内 に private メンバ int xxx; を置く
void setXXX(int) および
int getXXX() const を定義する
- ChildFromでは
MainForm* mf = static_cast<MainForm*>(GetParentFrame());
mf->setXXX(123); // write
int xxx = mf->getXXX(); // read
いつも回答ありがとうございます。
クラスとは元々メンバ変数を保護するためにあると知識では知っております。
従いまして、epistemeさんがどうしてグローバル変数を使うなと言われたかは理解しているつもりです。
しかしながら、プログラマーとしては使う必要性が無くとも知識としては当然のことながら知っておきたいし、目の前のある問題を素早く処理するため知っておきたかったのです。
正攻法として、ぜひepistemeさんの教えていただいた方法をマスターしたいのですが、結局今まで考えて分かりませんでした。
やろうとしていることは、メンバ関数を通じてデータの読み書きをする。と言うことは分かります。
しかし、具体的にどこに書いたら良いか良く分かりません。
申し訳ありませんが、もう少し教えていただきたいです。
<今分かっている疑問点>
>- MainForm内 に private メンバ int xxx; を置く
MainFormはMainFrameの間違いですか?
MainForm内とはMainFrm.cpp内のどこ?or MainFrm.h内のどこ?
>- ChildFromでは
>MainForm* mf = static_cast<MainForm*>(GetParentFrame());
>mf->setXXX(123); // write
>int xxx = mf->getXXX(); // read
MainFrame(MainFrom?)は定義されていないとエラーがでるのですが、どこに書けば良いのでしょうか?
基本的なことが分かってなくてすみません。
本やネットを調べましたが、main関数とクラスが一つの例題ばかりで、クラスから別クラスの変数を読む出す例が見つけられませんでした。
PCの調子が悪いので、今から得意のOSの再インストールをします。PCが復活したときには、返信が来ていることを祈りつつ終わります。
No.3
- 回答日時:
どのクラスでも使える変数を作成する場合、
C***App内でメンバー変数を宣言するのが良いと思います。
C***App以外のクラスで使いたい時は、
((C***App *)AfxGetApp())->xxx
でアクセスできます。
mk1234さんのケースの場合、
CMainFrame内でメンバー変数を宣言して、
AfxGetMainWnd()を使うのもいいかもしれません。
(使えるかどうかテストはしていませんが…)
>今回はグローバル変数をどこに書けばよいか教えていただきたいです
グローバル変数を利用するのが危険かどうかは、私は分かりませんが
グローバル変数を作成する場合、関数の外側で宣言します。
例として、
適当なソースファイル(*.CPP)の一番最初に
int xxx;
と書けばグローバル変数が作成されます。
複数のソースファイルで同じように宣言すると、
同じ名前の変数が2つ存在すると判断され、リンク時にエラーになります。
なので、int xxx;と宣言したソースファイル以外では
extern int xxx;
と宣言すると、リンクは正しく行われると思います。
いつも回答有難う御座います。
externを使うと言う巧妙な仕掛けが有ったのですね。
グローバル宣言を使ってうまく行きました。
またお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 学校 中2女子不登校です。中2の5月辺りからクラス替えの変化で1年の頃からのストレスによる頭痛が悪化し、体 2 2022/03/23 17:16
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- いじめ・人間関係 自分はとても不細工な男子高校3年生です。長文になりますが、よければ生き方を教えて下さい。 自分は一重 2 2022/04/15 02:12
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
2重定義って??
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
enumについて
-
VC6でlong longでエラー?
-
エラー「invalid conversion fr...
-
クラス間の変数について
-
void func( void )について
-
C++でboolにintの値を代入する...
-
dequeにconstが混ざったアイテ...
-
構造体を生成時にわざわざ初期...
-
C言語のコンパイルエラー
-
構造体
-
visualstudio C# テキストボッ...
-
スレッドのスケジューリングポ...
-
C言語でmain関数でのreturnとexit
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
ハンドルされていない例外が発...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報