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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

6046閲覧

C++:ヘッダーファイルの変数が読み込めない

ryo_se

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/05/15 13:07

C++,MFCアプリケーションを勉強中です。
以下プロジェクト名を「Test」とします。

現在Editコントロールに変数を割り当てようとしており、変数の追加機能で「edit1」という変数を追加しました。(TestView.hにも追加されています)

そこでTest.cppのInitInstance()にて、その変数に値を代入しようとしているのですが、何故か定義されていませんと怒られます。
勿論TestView.hはTest.cppにinclude済みです。

原因を教えていただければ幸いです。

また、VisualStudio2010を使用しているのですが、コードを記述するインテリジェンスが「追加情報はありません」と表示され全く機能してくれません。
こちらも可能であれば解決方法が知りたいです。

・TestView.h class CTestView : public CFormView { ----略----- public: CString edit1; afx_msg void OnEnChangeEdit1(); }; ・TestCpp.cpp #include "TestView.h" BOOL CTestApp::InitInstance() { ----略----- edit1 ="テスト"; ----略----- return TRUE; }

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

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

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

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

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

guest

回答5

0

CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); // ビューポインタを取得 CTestView* t_View = (CTestView*)pMainFrame->GetActiveView();

上記方法でViewクラスのポインタを取得し、Viewクラス内の変数、メソッドを扱うことが可能とわかりました。

投稿2016/05/16 13:24

編集2016/05/16 13:52
ryo_se

総合スコア68

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

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

0

誤投稿のため削除しました

投稿2016/05/16 13:23

編集2016/05/16 13:25
ryo_se

総合スコア68

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

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

0

私はMFCを使っていないので、的外れなことをいうかもしれませんが。

その状態 ( 質問のソースコード ) では、グローバル変数 ( or ローカル変数 ) にアクセスしている状態です。( 若しくは自分のクラスの変数。 )

別クラスのメンバ変数 ( フィールド ) にアクセスするには、

別クラスオブジェクト.フィールド名

のようにします。

CTestView obj = new CTestView ();

obj.Edit1 = "TEST";

みたいに。

投稿2016/05/16 04:03

BeatStar

総合スコア4958

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

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

0

ベストアンサー

こんにちは。

そこでTest.cppのInitInstance()にて、その変数に値を代入しようとしているのですが、何故か定義されていませんと怒られます。

これはHogeAnimalLoverさんも言っているように、クラスが異なるからです。
通常、クラス内のメンバ変数へアクセスするには、そのクラスのインスタンスも指定する必要があります。
ただし、同じクラスの場合は自分と同じインスタンスにあるものをデフォルトでアクセスしますので省略できます。省略しない場合はthis->edit1のように記述します。
しかし、異なるクラスのメンバの場合、その異なるクラスのインスタンスも指定する必要が有ります。
イメージ的には下記もその方法の1つです。

CTestView ev = new CTestView();
ev.edit1 ="test";

これは新しくCTestView()のインスタンスを作成します。
しかし、実際にはCTestViewのインタンスは既に作られていて画面に表示されています。ryo_seさんが使いたいedit1もその画面に表示されているCTestView上にあるものと思います。
従って、新たに作るのではなく既に作られているそのインスタンスを得る必要があると思います。

でも、ごめんなさい。その方法は私も分かりません。
結構FAQっぽい質問なので知っている人は知っていると思うのですが、MFCを使いこなすには膨大なMFCの知識+Windows APIの知識も多量に必要になるため学習量が多く、その割に生産性の低い仕組みなので今では使う人も減っており、情報も乏しいです。
現在MFCを使うのは、既に開発されたMFCプログラムをメンテナンスするようなケースが多いです。そのような時は周りにMFCについて詳しい方がいると思います。その方へ直接質問してみることをお勧めします。
後、こんなQAがありました。これらの書籍を使って学習するのも手かも知れません。

コードを記述するインテリジェンスが「追加情報はありません」と表示され全く機能してくれません。

については、IntelliSense が使用できない場合が参考になると思います。

投稿2016/05/16 01:09

Chironian

総合スコア23272

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

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

ryo_se

2016/05/16 13:26

IntelliSenseを無事出すようにできました、ありがとうございます。
guest

0

クラスの名前をよく見ましょう

投稿2016/05/15 13:19

HogeAnimalLover

総合スコア4830

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

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

ryo_se

2016/05/15 14:34

にらめっこしていましたがやはりわからないです・・。 TestCpp.cppでもTestView.hをincludeすればその変数は使えますよね? それともTestCpp.cppはTestCpp.hの変数しか読み込めないのでしょうか? またその場合、TestView.hの変数をTestCpp.cppで使用する方法がわかりません。
HogeAnimalLover

2016/05/15 14:43

class CTestView : public CFormView ヘッダでメンバ変数が定義されているクラスの名前(CTestView) BOOL CTestApp::InitInstance() ソースでメンバ変数が定義されているクラスの名前(CTestApp)
HogeAnimalLover

2016/05/15 14:44

間違えました、「ソースでメンバ変数が→ソースでメンバ関数が」
ryo_se

2016/05/15 15:03

つまりは同じクラス内の変数しか扱えないということですね。 そこでedit1をTestCppで使用しようと試行錯誤してみたのですが、解決できません。 インスタンスを作成しようと思ったのですが、protectedメンバー扱いでアクセスできないとのことでした。 CTestView ev = new CTestView(); ev.edit1 ="test";
HogeAnimalLover

2016/05/15 15:08

ちなみに、ヘッダとソースのファイル名の不一致は問題ありません。ただ、本件で定義されてるものはCTestViewクラスでメンバ変数(非static)であって、CTestAppクラスのメンバ関数で使用できるものではないですね。
HogeAnimalLover

2016/05/15 15:22

あ、更新されてた。 私はMFCに詳しくはありませんが、既存クラスをnewするというのはそもそもOKなの?他のクラスのメンバ変数をメンバ関数から操作するならば、インスタンスが必要なのはその通りですけど、新しく作るのは不自然だと思いますよ。 一度やりたいことを整理したほうがいいと思いますよ。そもそも無理解探しているか、不要なことを目指しているようにも見えますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問