アプリ版:「スタンプのみでお礼する」機能のリリースについて

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);

A 回答 (2件)

>継承?? オーバーライド?? はっきりとは理解できていません。



virtual void OnPollingSend(int count) = 0;は純粋仮想関数ですが
それを理解するために継承やオーバーライドの事を理解する必要があります。
まずそこを書籍等で学習してください。
CEvent::OnPollingSendが純粋仮想関数のようですが
なにも実装されていないのに
m_Event->OnPollingSend(count);
としています。
これではコンパイルが通りません。
ここでvoid CPollingDlg::OnPollingSend(int count) が呼ばれると思っていませんか?

マルチスレッド化の前に、まずコンパイルエラーを無くす方が先決です。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
書籍やネットで調べプログラムを作りながら継承などを学習しようと思っていましたが、甘かったようです。。

>ここでvoid CPollingDlg::OnPollingSend(int count) が呼ばれると思っていませんか?
全くその通りです。呼ばれると思っていました。
クラスへのポインタをアクセスすれば良いと思っていました。やっぱり中身がないとダメなんですね。
 

 

お礼日時:2006/09/14 23:02

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);

私がやりたいことは、送受信スレッドから、整数値をダイアログボックス
に送るループを作りたいと言うことです。

補足日時:2006/09/14 19:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!