1. ホーム
  2. c++

c++のクラスでシグナル関数を使用する

2022-02-08 08:10:55
<パス

例は以下の通りです。

using namespace std;
class test
{

public:
    void a()
    {
        while ( 1 )
        signal( SIGINT, change );
    }

    void change( int sag ) 
    {
        cout << "here\n";
    }
};
int main()
{
    test t;
    t.a();
}

これは、エラーを報告します
error: invalid use of non-static member function

なぜなら、signalの関数プロトタイプだからです。

void (*signal(int signo , void (*func)(int)))(int);

signo: 処理される信号を示す。
func: は void funciont(int) 型の関数へのポインタである。
戻り値:戻り値は void function(int) 型の関数への関数ポインタである。


また、クラス内のメンバ関数を呼び出すと、暗黙のうちにこのポインタが関数の前に置かれるため、パラメータのミスマッチが発生します。
解決策は
1. change()をスタティック関数として宣言する。静的関数は、このポインタを暗黙のパラメータとして受け取りません。
2. 2. フレンド関数を使用し、クラス自身のメンバーにはアクセスできるが、クラスのメンバーにはアクセスできないようにする。