【问题标题】:Send function from one class to the other and execute it in C++将函数从一个类发送到另一个类并在 C++ 中执行
【发布时间】:2012-08-26 02:45:01
【问题描述】:

我想创建一个类,我们将其命名为 A 类,它执行其他类的函数。所以我想从这个 A 类和 A 类继承我的类,以便能够从派生类接收函数地址并执行它们。

这是我目前的想法:

#include <iostream>
using namespace std;

template <class T>
class A
{
public:
    // a typedef for the function I want to execute 
    // which has no parameters and void as return type
    typedef void (T::*SpecialFunc)();

    A() { }

    //this is the function that executes the received functions
    void exec(SpecialFunc func)
    {
        ((new T)->*func)();
    }
};

class B : public A<B>
{
public:
    B()
    {
        // call A::exec to call my function
        exec(&B::funcB);
    }

    //function I want to be executed
    void funcB()
    {
        cout << "testB\n";
    }
};

int main()
{
    B ob;

    return 0;
}

我想要的是函数 funcB 被调用。到目前为止,我的程序没有错误地中断,只是严重中断。 我知道这段代码不能工作,因为我尝试构建需要来自 B 类的信息的 A 类,而 B 类需要来自第一个 A 类的信息来构建,但我希望你能更好地理解我愿意实现的目标。

这可以实现吗?

谢谢

【问题讨论】:

  • 你试过使用 std::function 吗?

标签: c++ class function inheritance signature


【解决方案1】:

1) “A 类需要来自 B 类的信息,B 类需要 第一类A的信息”

-防止循环引用使用前向声明

2) 我建议以下实现你的想法

  1. 具有纯虚函数的抽象类(类Abstr)
  2. 其他类从它继承(派生)
  3. 类管理器 - 作为参数抽象类,您可以提供任何派生类并为某些类调用虚函数

我认为给定的方法可以让您更有效地使用 OOP 想法

【讨论】:

    【解决方案2】:

    看起来你在这里有无限递归。您在B 的构造函数中调用exec(),它通过new 语句创建新的B 对象,该语句调用B 的构造函数,该构造函数调用exec() 等。可能您需要传递指针或引用B反对exec() 以避免其构造。

    当然,exec() 中的 B 对象泄漏看起来不太好。我希望它只是用于测试目的...

    【讨论】:

    • 我将行 exec(&amp;B::funcB); 从构造函数 B() 移动到 void run() 函数并使用对象 ob 调用它,如下所示:ob.run()。现在代码按我的预期运行。关于对象泄漏...如何释放临时 new Type 的内存?
    • 你必须使用delete就可以了。或者更好使用智能指针,它会为你做清理工作。 std::unique_ptr 如果您使用 C++11,std::auto_ptrboost::scoped_ptr 如果您使用旧版 C++03。
    • 顺便问一下,这里为什么需要new?对象范围是本地的,所以只需在堆栈上创建它:void exec(SpecialFunc func) { T obj; (obj.*func)(); }
    • 感谢您的回答 :) 我也考虑过使用智能指针或创建一个对象,但我认为有可能释放在new Type 分配的内存,因为new Thing 是一个临时对象,没有名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多