【问题标题】:Managing member function execution in C++在 C++ 中管理成员函数执行
【发布时间】:2011-02-23 09:42:16
【问题描述】:

我有一个类Managed,其中包含一个函数f,它执行该类的其他函数。

class Managed {
public:
    Managed(){}
    ~Managed(){}

    int f( some arguments ); //managed function
private:
    int A();
    int B();
    int C();
};

我想根据 Managed 类的对象的构造方式来管理 f 执行的操作,即使其表现得像这样

int Managed::f (some arguments) {
    A();
    B();
    A();

    return 0;
}

或者像这样

int Managed::f (some arguments) {
    C();
    B();

    return A();
}

等等

我需要非常灵活的管理,我需要像编写函数 f 的行为脚本之类的东西。我如何在 C++ 中做到这一点?

【问题讨论】:

  • 它非常不清楚。您不能从 void 函数返回任何内容。 some arguments 是什么?他们是否控制f 的行为方式?您能告诉我们您要解决什么问题吗?
  • 抱歉,已更正返回类型。
  • 如何在Managed::f(int arg1) 中编写一个开关函数,根据它的参数来完成特定的工作。基于任何类型的对象(即驻留在堆栈/堆上),该方法的功能在实例上调用时不会改变。所以,我不确定你的意思是什么时候,depending on the way the object of class Managed was constructed

标签: c++ oop function


【解决方案1】:

您的问题遗漏了几个关键细节(例如 some arguments 应该做什么)。但是,听起来您可能需要Managed 来包含函数指针的std:list。那么f函数就可以简单的遍历list,依次调用每个元素指定的函数。

我无法评论您如何填写该列表;这将取决于您的类的 API。

【讨论】:

    【解决方案2】:

    使用Strategy design pattern

    在这种特殊情况下,您不需要带有接口的完整策略模式实现。一个函数指针可以:

    class Managed {
    public:
        Managed(int type)
        {
            switch(type) {
            case 1: strategy_ = strategy1; break;
            case 2: strategy_ = strategy2; break;
            default: abort();
            }
        }
    
        int f(int arg) { return strategy_(this, arg); }
    
    private:
        static int startegy1(Managed* that, int arg)
        {
            that->A();
            that->B();
            that->C();
            return arg;
        }
    
        static int startegy2(Managed* that, int arg)
        {
            that->A();
            that->C();
            return arg;
        }
    
        // ... more strategies ...
    
        int A();
        int B();
        int C();
    
        int(*strategy_)(Managed*, int arg);
    };
    

    【讨论】:

    • 忘记从 f() 返回 int,但到目前为止这是我的最爱
    【解决方案3】:

    听起来您可以使用命令设计模式。您的 f 函数应该采用“命令”的集合(向量或列表)(可以是简单的枚举整数,如 Call_A、Call_B、Call_C、Call_A_SaveReturnValue、Call_B_SaveReturnValue、Call_C_SaveReturnValue、ReturnSavedValue、Return0、ReturnInt 等,或更复杂的对象来表示更复杂的功能,那么你的函数 f 按顺序“执行”这些命令并为每个“命令”执行功能。

    编辑:如果您想要 f() 的参数用于其他目的(在您的问题中并不清楚),那么只需将命令行设置为类的状态并使用 f() 的参数随心所欲。

    【讨论】:

    • 策略模式或策略模式
    • 是的,这可行,但 OP 想要具有很大灵活性的“脚本”之类的东西,我认为命令比策略更接近。
    【解决方案4】:

    在 c++ 中很难做到你想要的,因为它是一种强类型语言,这使它无法像某些脚本语言那样完全灵活。例如,如果你需要传递一个在编译时不固定的类型的变量,你会发现很难做你想做的事。

    如果你不需要完全的灵活性,并且方法的签名是固定的,那么最简单的方法是使用指向成员方法的指针结合 switch 或查找表。

    【讨论】:

      【解决方案5】:

      也许,你应该尝试使用继承来解决问题:

      管理类 { 上市: 管理(){} 〜托管(){} 虚拟 int f(int a,int b,int c); 受保护: int A() {返回 1;} int B() {返回 2;} int C() {返回 3;} }; Managed1 类:公共托管 { 托管1(){} ~Managed1(){} 虚拟 int f(int a,int b,int c) { 一个(); 乙(); 一个(); 返回 4; } };

      【讨论】:

      • 那里很好,描述性的类名。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2010-11-21
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多