gpt4 book ai didi

c++ - 是否可以在 C++ 类中使用信号?

转载 作者:IT老高 更新时间:2023-10-28 12:41:12 26 4
gpt4 key购买 nike

我正在做这样的事情:

#include <signal.h>

class myClass {
public:
void myFunction ()
{
signal(SIGIO,myHandler);
}

void myHandler (int signum)
{
/**
* Handling code
*/
}

}

我正在使用 gcc 在 Ubuntu 上工作。

但它不会编译。它提示:

error: the argument with type void (MyClass::)(int) doesn't agree with void (*) (int)

有什么线索吗?或者也许只是我不能在类中使用信号?信号只允许在 C 中使用吗?

错误信息是近似翻译,因为我的编译器不是英文的。

最佳答案

signal 的第二个参数应该是一个指向接受 int 并返回 void 的函数的指针。您传递给信号的是一个指针,指向一个接受 int 并返回 void 的 member 函数(其类型为 void (myClass::*)(int))。我可以看到克服这个问题的三种可能性:

1 - 你的方法 myHandler 可以是静态的:这很棒,让它成为静态的

class myClass 
{
public:
void myFunction ()
{
signal(SIGIO, myClass::myHandler);
}

static void myHandler (int signum)
{
// handling code
}
};

2 - 你的方法不应该是静态的:如果你打算只使用一个实例的信号,你可以创建一个私有(private)的静态对象,并编写一个静态方法,简单地调用这个对象上的方法。类似于

class myClass 
{
public:
void myFunction ()
{
signal(SIGIO, myClass::static_myHandler);
}

void myHandler (int signum)
{
// handling code
}

static void static_myHandler(int signum)
{
instance.myHandler(signum);
}

private:
static myClass instance;
};

3 - 但是,如果您计划在多个实例中使用信号,事情会变得更加复杂。也许一个解决方案是将您想要操作的每个实例存储在一个静态 vector 中,并在每个实例上调用该方法:

class myClass
{
public:
void myFunction () // registers a handler
{
instances.push_back(this);
}

void myHandler (int signum)
{
// handling code
}

static void callHandlers (int signum) // calls the handlers
{
std::for_each(instances.begin(),
instances.end(),
std::bind2nd(std::mem_fun(&myClass::myHandler), signum));
}
private:
static std::vector<myClass *> instances;
};

在某个地方,打一次电话

signal(SIGIO, myClass::callHandlers);

但我认为,如果您最终使用最后一种解决方案,您可能应该考虑更改您的处理设计:-)!

关于c++ - 是否可以在 C++ 类中使用信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/343219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com