• 締切済み

関数で整数の受け渡しについて。

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

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

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

hagimoto
質問者

お礼

アドバイスありがとうございます。 書籍やネットで調べプログラムを作りながら継承などを学習しようと思っていましたが、甘かったようです。。 >ここでvoid CPollingDlg::OnPollingSend(int count) が呼ばれると思っていませんか? 全くその通りです。呼ばれると思っていました。 クラスへのポインタをアクセスすれば良いと思っていました。やっぱり中身がないとダメなんですね。    

回答No.1

virtual void OnPollingSend(int count) = 0; これは、どういう事がしたいんでしょうか?

hagimoto
質問者

補足

私が書いているこれは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); 私がやりたいことは、送受信スレッドから、整数値をダイアログボックス に送るループを作りたいと言うことです。

関連するQ&A

  • 関数ポインタにvirtual関数を与えたいです

    //関数ポインタについて質問させてください。 //error C2440: '=' : 'void (__thiscall A::* )(int,int)' から 'void (__cdecl *)(int,int)' に変換できません。 //というエラーが出ます。 //どうすればいいのか教えてください。 //よろしくお願いします。 #include<stdio.h> class A { public: void (*aaa)(int a,int b); virtual void test(int a,int b)=0; virtual void test2(int a,int b)=0; void execute() { aaa=test;//error C2440 } }; class B : public A { public: void test(int a,int b) { printf("test"); } void test2(int a,int b) { printf("test2"); } }; int main() { B b; b.execute(); b.aaa(2,3); return 0; }

  • 仮想関数と継承について

    #include <iostream> using namespace std; class AAA { public: virtual aaa() { cout <<"aaa(void)"<<endl;} }; class BBB : public AAA { public: virtual aaa(int a) { cout <<"aaa(int)"<<a<<endl;} }; int main() { BBB bbb; bbb.aaa();<--これがエラーになります。 return 0; } どうして、既定クラスの引数なしのaaa()はよぶことが できないのでしょうか?

  • ラムダ式を関数に渡したいのですが

    Class1からClass2にある関数の引数にラムダ式で関数を渡すようなプログラムを作ろうと思い、以下のようにコードを記述しました。 #include <iostream> class Class1 { int i = 0; void func() { std::cout << "Hello world" << std::endl; } void init() { Class2 *class2 = new Class2(); class2->setFunc([this] { func(); i++; }()); } }; class Class2 { void(*mFunc)(); void runFunc(){ mFunc(); } public: void setFunc(void func()) { mFunc = func; } }; すると class2->setFunc([this] { func(); i++; }()); のところで「型"void"の引数は型"void(*)()"のパラメーターと互換性がありません」というエラーが発生してしまいます。 キャプチャにthisを渡したラムダ式を他のクラスの関数ポインタのような変数に代入させるようにしたいのですがどのように記述したらできますか

  • ポインタのポインタの関数受け渡しについて

    現在ポインタのポインタを利用したプログラムを作成しています。 main関数で int **dt; と宣言したとして、配列のセットにはset関数を、 表示に関する処理をpt関数で行いたいと思っています。 void set(int ??); void pt(int ???); int main(void){ int **dt; set(??); pt(???); } void set(int ??){ dt = (int**)malloc(sizeof(int*) * k); for(i = 0; i < k; i++){ dt[i] = (int*)malloc(sizeof(int*) * k); } のように配列サイズの動的確保が目的 } void pt(int ???){ 二重forループ{ printf(dt[i][j]); } } ??、???には何を入れるべきかが理解できません。 ご教示のほどよろしくお願いいたします。

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */

  • 静的でないメンバ関数の呼び出しが正しくありません

    コンパイル時に「静的でないメンバ関数の呼び出しが正しくありません」となってしまいます。 普通の関数からメンバー関数を呼び出すには、どう記述すればいいのでしょうか? void MyDataHandler(sFrameOfData* FrameOfData) { CFrrjiftestDlg::sndrobot();  ← ここがコンパイルエラー } void CFrrjiftestDlg::sndrobot() { いろいろ記述 } //*** 以下、ヘッダー class CFrrjiftestDlg : public CDialog { DECLARE_DYNAMIC(CFrrjiftestDlg); friend class CFrrjiftestDlgAutoProxy; // Construction public: CFrrjiftestDlg(CWnd* pParent = NULL); // standard constructor virtual ~CFrrjiftestDlg(); void msubInit(); void sndrobot();   ←ここで宣言 };

  • メンバ関数(メソッド)をマルチスレッドにしたい

    環境はWinXPでVisual Studio 2005を使用しています。 C言語で関数をマルチスレッド化するにはこんな感じでOKでした。 // マルチスレッド関数 void Thread( void * ) { } void MainFunc() {   (HANDLE)_beginthread( Thread, 0, NULL ); } こんな風にスレッド関数をC++のメソッドに変えてうまくいくかと思い class Test_c { public:   void Thread( void * ); } ; // マルチスレッド関数 void Test_c::Thread( void * ) { } void MainFunc() {   Test_c t t;   (HANDLE)_beginthread( t.Thread, 0, NULL ); } とするとエラーが出てきてしまい、コンパイルが通りませんでした。 C++のメンバ関数をマルチスレッド関数としたい場合はどの様に書けばよいのでしょうか・・?

  • 仮想関数でのオーバーライドでの質問

    仮想関数でのオーバーライドでの質問 二つの派生クラスを定義したのですが、一つ目のクラスのメソッドが実行されないで困っています。 下記にソースを載せておきます。 どこが原因でそうなるのかご指摘お願いします。 /* 継承 */ #include <iostream> using namespace std; class Var { private: int value; static Var* re; public: // 静的関数 static bool func() { // 内部で同一の関数を呼び出す re->show(); return true; } virtual show() { cout << "message00" << "moji" << endl; } // 自身のポインタを取得 Var() { re = this; } }; Var* Var::re = NULL; class Msg01 : public Var { private: int value; public: show(void) { cout << "message01" << "moji" << endl; } }; class Msg02 : public Var { private: int value; public: show(void) { cout << "message02" << "moji" << endl; } }; int main() { Msg01 val; Msg02 msva; val.func(); msva.func(); getchar(); return 0; } /------------------------------------------------------/ 実行結果 message02moji message02moji /------------------------------------------------------/ message01mojiが表示されるはずなんですが表示されないでいます。 Msg02を宣言したためこのようになってしまったんでしょうか?

  • キャストによるアドレス変更について

    多重継承クラスのインスタンスのポインタを基底クラスのポインタ に代入するとき、キャストで、vtableへのポインタを変更するために、 多重継承クラスのインスタンスのポインタのアドレスから4byte加算 したアドレスが、基底クラスのポインタに代入されます。 以下のプログラムは、多重継承ではないですが、pCのポインタの アドレスに4byte加算してpAに代入されます。pAのデストラク タはvirtual宣言していないので、pAが指すアドレスにはvtable のポインタはないはずですが、4byte加算するという動作が起こるのは 何故でしょうか。 #include <iostream.h> class AAA { public: AAA(){} ~AAA(){} }; class BBB:public AAA { public: BBB(){} virtual ~BBB(){} }; class CCC:public BBB { public: CCC(){} ~CCC(){} }; int main(void) { CCC *pC = new CCC(); AAA *pA = (AAA *)(pC); delete pA; return 0; }

専門家に質問してみよう