Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有继承类的Void指针_C++ - Fatal编程技术网

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
是a
B
的成员函数,因此您必须限定其名称:

A::setFn1(&B::fn2)
//         ^^^
此外,
fn2
应该是
静态的
,因为非
静态的
成员函数实际上在隐式的
这个
指针上工作,所以它们接受一个参数:

class B : public A{
public:
    B();
    static void fn2();
//  ^^^^^^
};
通过这两个更改,您的程序应该可以编译

当我调用:A::setFn1(&fn2)时,我得到以下编译器错误

fn2
是a
B
的成员函数,因此您必须限定其名称:

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
可以完全不相关(这可能会使