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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
C++のfor文について
-
ブロックの外で関数をコールで...
-
main.c:7:43: warning: implici...
-
sshdログの意味
-
C++デバックエラーについて詳し...
-
C++ template operator T()
-
C++でboolにintの値を代入する...
-
C言語でmain関数でのreturnとexit
-
コンパイルすると error C1083 ...
-
構造体の要素すべてに対する四...
-
C++ クラスをメンバにもつクラ...
-
main()とint main(void)の違い
-
構造体vectorの入れ子のfillの...
-
void func( void )について
-
関数の実体定義にヘッダファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
void func( void )について
-
【#define】 defineで定義した...
-
VC6でlong longでエラー?
-
0除算を判定したい
-
プログラムの中で別のmainを呼...
-
C言語のコンパイルエラー
-
構造体の宣言でエラーが出ます。
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報