初歩的な質問で申し訳ありません。
下記のようなクラスを定義したのですが、
class CA
{
private:
CString str;
public:
CString GetStr;
}
void CA::SetStr()
{
str = xXxX; // <--本当はファイルから取得しています。
}
CString CA::GetStr()
{
return (str);
}
------------------------------
下記のクラス(CxxxApp)にメンバ変数作成し、SetStr()を呼び出す。
private:
CA m_A;
BOOL CxxxApp::InitInstance()
{
省略...
m_A.SetStr();
省略...
}
で、あるダイアログから
CString strX = CA::GetData();
といった感じで取得したのですが、結果が「0」となり、うまくいきません。
また、できれば、CxxxAppでメンバ変数を使用せずに、SetStr()を呼び出す方法も教えて欲しい
のです。
なにぶん、VCを始めて1週間ですので、解らない事だらけで申し訳有りませんが、
どうか、教えてください。
追記:MFCを使用しダイアログ形式で作成しています。
>str = xXxX; // <--本当はファイルから取得しています。
ファイルから取得するという部分は動作確認が取れているのでしょうか?
>CxxxAppでメンバ変数を使用せずに、SetStr()を呼び出す方法
SetStr()がprivateなクラスメンバでなければ、CxxxAppクラスをCAクラスから派生させる。
>ファイルから取得するという部分は動作確認が取れているのでしょうか?
はい、デバックやメッセージボックスを立ち上げる等をして確認が取れています。
補足ですが、CxxxAppは一番最初に呼ばれるクラスらしいので、「InitInstance」の中に記述
しました。
また、ファイルは一度読み込んだら、再度読み込む必要が無いのです。
そういった考えを元に作成しておりますが、どのような方法が一番効率がいいのか判らないの
で、そのあたりもご指導願えたらと思っております。
まことに勝手だと思いますが、よろしくお願いします。
>また、ファイルは一度読み込んだら、再度読み込む必要が無いのです。
設定情報でも読み込ませているのでしょうか?
MFCでダイアログベースでしたよね。
CxxxAppDlg::OnInitDialog()で
「// TODO: 特別な初期化を行う時はこの場所に追加してください。」
に記述してもいいのではないのでしょうか?
できれば、後々の事を考えて機能別に分割をしようと思いまして・・・確かに、
CxxxAppDlg::OnInitDialog()に記述してしまえば、簡単に済むことなのでしょうが、
(私にとっては簡単な事ではないのですが・・・)
希望としては、クラス>クラス>クラス……みたいな事がしてみたいのです。
本当に生意気だと思っております。
そこを何とかお願いします。
>SetStr()がprivateなクラスメンバでなければ、CxxxAppクラスをCAクラスから派生させる。
これはどうなったのでしょう?
>SetStr()がprivateなクラスメンバでなければ、CxxxAppクラスをCAクラスから派生させる
CxxxAppクラスは
CxxxAppDlg::OnInitDialog() : CA::SetStr
としてもいいのでしょうか?
MFCが作ったクラスなので、弄らない方がいいのでは・・・と思っていたのですが・・・
CAクラスの詳細がわからないのですが、とりあえず試してみては?
CAクラスは上記のとおりです。
ファイルの読込のところを省略しただけなので、クラスとしては問題ありません。
ただ、
class CxxxApp : public CWinApp
となっているので、派生クラスを追加できるのでしょうか?
>class CxxxApp : public CWinApp
とりあえず以下の様にしてみてください。
class CxxxApp : public CWinApp, public CA
問題があればまた。
派生を追加する事が出来ました。(^○^)
ただ、このぐらいの機能に対しメインとなる、CxxxAppに派生させていいのでしょうか?
逆にメンバ変数を作成して実行した方がいいのでしょうか?
どちらにしても、実数値が取得できないので、よろしくお願いします。
>ただ、このぐらいの機能に対しメインとなる、CxxxAppに派生させていいのでしょうか?
>逆にメンバ変数を作成して実行した方がいいのでしょうか?
私としてはどちらでもいいような……。
>どちらにしても、実数値が取得できないので、よろしくお願いします。
そのあたりの現在のソースを載せてもらえると答えやすいかと思います。
あるダイアログから
CString strX = CA::GetData();
みたいな事をしたいのですが・・・
できました。(^o^)丿
CxxxApp *pApp = ((CxxxApp*)AfxGetApp());
この記述でCxxxAppの内部変数を参照できるようになるので、
CString str = pxxxApp->GetStr();
と記述すると実数値が取得できました。
NGAさん・・・本当にありがとうございました。クラスを継承する事で、メンバ変数から何と
か・・・って事がなくなったので、すっきりしたコーディングになりましたし、
この方法が初心者には理解しやすいかな?
って思います。