C++ 具有继承类的Void指针
我有一个类,C++ 具有继承类的Void指针,c++,C++,我有一个类,a,它需要静态事件处理程序。我需要静态事件处理程序,因为一个中断正在调用事件处理程序 class A { private: static void (*fn1)(); public: A(); static void setFn1(void (*function)(void)); static void onEvent(); }; A::A() { } void A::setFn1(void (*function)(void)) { fn
a
,它需要静态事件处理程序。我需要静态事件处理程序,因为一个中断正在调用事件处理程序
class A {
private:
static void (*fn1)();
public:
A();
static void setFn1(void (*function)(void));
static void onEvent();
};
A::A() { }
void A::setFn1(void (*function)(void)) {
fn1 = function;
}
void A::onEvent() {
A::fn1();
}
我想基于应用程序继承A
,并创建事件
子级中的处理程序逻辑,此处使用fn2
class B : public A{
public:
B();
void fn2();
};
B::B() {
A::setFn1(&fn2);
}
void B::fn2() {...}
当我调用:A::setFn1(&fn2)
时,我得到以下编译器错误
#169类型为“void(B::)()”的参数与类型为“void()()”的参数不兼容
我的脑子里充斥着这些空洞的指针,我甚至不知道我是否还在使用正确的设计。A
类包含我所有的实用方法。B
类包含我特定于应用程序的功能
当我调用:A::setFn1(&fn2)时,我得到以下编译器错误
fn2
是aB
的成员函数,因此您必须限定其名称:
A::setFn1(&B::fn2)
// ^^^
此外,fn2
应该是静态的
,因为非静态的
成员函数实际上在隐式的这个
指针上工作,所以它们接受一个参数:
class B : public A{
public:
B();
static void fn2();
// ^^^^^^
};
通过这两个更改,您的程序应该可以编译
当我调用:A::setFn1(&fn2)时,我得到以下编译器错误
fn2
是aB
的成员函数,因此您必须限定其名称:
A::setFn1(&B::fn2)
// ^^^
此外,fn2
应该是静态的
,因为非静态的
成员函数实际上在隐式的这个
指针上工作,所以它们接受一个参数:
class B : public A{
public:
B();
static void fn2();
// ^^^^^^
};
通过这两个更改,您的程序应该编译。非静态成员函数不是自由函数,类型不同。您不能将非静态成员函数当作指向函数的指针来使用:
struct test {
void foo();
static void bar();
};
&test::foo --> void (test::*)()
&test::bar --> void (*)()
我不建议将函数更改为
静态
,因为我不认为当前的设计特别有用。但是你可以考虑一下,试着重新考虑一个更有意义的设计。(一个用于所有进程的回调函数?为什么要继承?一个用户定义的构造函数,其作用与不应实例化的类中生成的编译器相同?…)非静态成员函数不是自由函数,类型不同。不能将非静态成员函数当作指向函数的指针来使用:
struct test {
void foo();
static void bar();
};
&test::foo --> void (test::*)()
&test::bar --> void (*)()
我不建议将函数更改为
静态
,因为我不认为当前的设计特别有用。但是你可以考虑一下,试着重新考虑一个更有意义的设计。(一个用于所有进程的回调函数?为什么要继承?一个用户定义的构造函数,其作用与不应实例化的类中生成的编译器相同?…)这些不是无效指针!它们是指向不带参数但不返回任何内容的函数的指针。这些不是无效指针!它们是指向不带参数但不返回任何内容的函数的指针。当我执行A::setFn1(&B::fn2)时,我得到以下编译错误:#278 name后跟“:必须是类或命名空间名称。此外,这可能是设计问题,因为我需要fn2是非静态的,因为它需要使用非静态成员变量。@zam664:确实要完全复制所有内容吗?它会编译。如果我使用fn2()静态——是的,它可以编译。但是我需要非静态的来访问成员变量,而它不会编译。我真的认为我有一个设计问题,因为我需要跨越这个静态/非静态的障碍。当我执行a::setFn1(&B::fn2)时,我得到以下编译错误:#278 name后跟”:必须是类或命名空间名称。此外,这可能是设计问题,因为我需要fn2是非静态的,因为它需要使用非静态成员变量。@zam664:确实要完全复制所有内容吗?它会编译。如果我使用fn2()静态——是的,它可以编译。但我需要非静态访问成员变量,而它不能编译。我真的认为我有一个设计问题,因为我需要跨越这个静态/非静态屏障。我使用一个微控制器,我需要挂接到中断表中。我让那些中断调用我库的静态成员父类是实用类,而子类是应用程序类——它们都是单体。现在所有的代码都在C.,我想通过将它引入C++中来利用Outle,但是我遇到了这个机器级接口的问题。@ ZAM664:您应该知道在Pad中调用的约定是什么。m是,您可能想添加extern“C”
。使用继承毫无意义。为什么派生类型不直接向中断注册函数,为什么要额外的间接寻址?即使您想要间接寻址,A
没有需要模拟的接口,B
也可以完全不相关(这可能更有意义)。你也可以使用一个简单的旧免费函数,利用OOD和锤击OOD是不同的事情,使用更适合任务的工具。我使用的是微控制器,我需要挂接到中断表中。我让这些中断调用基类的静态成员。父类是实用类,而孩子们将成为应用程序类——他们都是独生子。现在所有的代码都在C.,我想通过把它引入到C++中来利用Outle,但是我遇到了这个机器级接口的问题。@ ZAM664:你应该知道平台中的调用约定是什么,你可能想添加<代码>外部“C”。。继承的使用毫无意义。为什么派生类型不直接向中断注册函数,为什么要额外的间接寻址?即使您想要间接寻址,A
没有需要模拟的接口,B
可以完全不相关(这可能会使