- 締切済み
関数で整数の受け渡しについて。
VisualC++6.0 SDI でプログラムの勉強をしています。 マルチスレッドから int型 の整数を受け渡ししたいのですが、 「'identifier' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」 とエラーが出てしまいます。どうしたらよいでしょうか? どのような処理をしているのか抜き出しました。 見難い上に、私の理解が不十分なため必要な記述が抜けているかもしれませんが、 指摘、アドバイスなどよろしくお願いします。 //マルチスレッドの中に記述し int count の整数を受け渡す記述 //pInst は class CSerialへのポインタ for(count =0; count<3; count++){ pInst->TransmitData(count); 処理;//ここで int count を使いたい。 } // class Serial class CSerial { public: CSerial(CEvent *Event); ~CSerial(void); private: void TransmitData(int count); }; // 継承?? オーバーライド?? はっきりとは理解できていません。 void CSerial::TransmitData(int count) {//m_Eventは class Event へのポインタ m_Event->OnPollingSend(count); } // Class Event class CEvent { public: CEvent() { } virtual ~CEvent() { } virtual void OnPollingSend(int count) = 0; }; //Class Event が書かれているファイルを#includeしています。 void CPollingDlg::OnPollingSend(int count) { マルチスレッドスタート;//すでにスタートしていたらジャンプ 処理;//ここで int count を使いたい } //ボタンはclassWizard で作りました(INT)は後から付けてしてみました。 //ボタンが押されたら呼び出されます。 ON_BN_CLICKED(ID_POLLING_SEND, OnPollingSend(INT)) // 生成されたメッセージ マップ関数 afx_msg void OnPollingSend(INT);
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sha-girl
- ベストアンサー率52% (430/816)
>継承?? オーバーライド?? はっきりとは理解できていません。 virtual void OnPollingSend(int count) = 0;は純粋仮想関数ですが それを理解するために継承やオーバーライドの事を理解する必要があります。 まずそこを書籍等で学習してください。 CEvent::OnPollingSendが純粋仮想関数のようですが なにも実装されていないのに m_Event->OnPollingSend(count); としています。 これではコンパイルが通りません。 ここでvoid CPollingDlg::OnPollingSend(int count) が呼ばれると思っていませんか? マルチスレッド化の前に、まずコンパイルエラーを無くす方が先決です。
- red_hot_boy
- ベストアンサー率55% (10/18)
virtual void OnPollingSend(int count) = 0; これは、どういう事がしたいんでしょうか?
補足
私が書いているこれはRS-232Cを使ったデータの送受信を行うプログラムで、 ネット上に公開されていたサンプルプログラムの、受信のみを行うスレッドを、 ストップボタンが押されるまで、送信→受信→送信→ と繰り返される”送受信”スレッドにしようと色々試しているものです。 今回質問させていただいた物は送信ループのつもり?のものを抜粋したものでした。 受信ループは同じように記述して(たぶん)成功したので、同じように書きました。 受信ループはこのようになっております。 //pInst は class CSerialへのポインタ for(count =0; count<3; count++){ ダイアログボックスのデータを送信する処理; 受信処理; //pInstはclass CSerialへのポインタ pInst->ReceiveData(str, dwRead, count);//ダイアログで受信データ書き込み処理 } class CSerial { public: CSerial(CEvent *Event); ~CSerial(void); private: void ReceiveData(LPCSTR str, DWORD strLength, int count); }; // 受信時のイベントを投げる void CSerial::ReceiveData(LPCSTR str, DWORD strLength, int count) { //m_Eventは class Event へのポインタ m_Event->OnReceive(str, strLength, count); } // イベントを受信する場合、このクラスを継承して // OnReceive()をオーバーライド実装してください. class CEvent { public: CEvent() { } virtual ~CEvent() { } virtual void OnReceive(LPCSTR str, DWORD strLength, int count) = 0; }; //Class Event が書かれているファイルを#includeしています。 void CPollingDlg::OnReceive(LPCSTR str, DWORD strLength, int count) { 処理;//ここで int count を使いたい } //OnReceive関数の宣言 void OnReceive(LPCSTR str,DWORD strLength, int count); 私がやりたいことは、送受信スレッドから、整数値をダイアログボックス に送るループを作りたいと言うことです。
お礼
アドバイスありがとうございます。 書籍やネットで調べプログラムを作りながら継承などを学習しようと思っていましたが、甘かったようです。。 >ここでvoid CPollingDlg::OnPollingSend(int count) が呼ばれると思っていませんか? 全くその通りです。呼ばれると思っていました。 クラスへのポインタをアクセスすれば良いと思っていました。やっぱり中身がないとダメなんですね。