如何创建函数管道,以便函数一个接一个地运行?



我想创建每个类都与某个函数相关联的类。我想将这些函数串联堆叠,以便一个函数按用户定义的顺序运行。我是新手C++所以如果我的语法错误,请纠正我。

#include<iostream>
using namespace std;
class Function
{
public:
virtual void setSuccessor(Function *) = 0;
virtual void Start(int value) = 0;
};
class Prime:public Function
{
public:
Prime()
{
successor=NULL;
}
Function *successor;    
void setSuccessor(Function *f)
{
//if a successor is not declared then assign successor.
//else if a successor is already defined then set the new function as the successor of the successor.
if (successor == NULL)
successor = f;
else
successor->setSuccessor(f); 
}
void Start(int value)
{
//prime function
cout<<"I am Prime Functionn";
//if successor !=null
//  call successor
if(successor!=NULL)
successor->Start(value);
}
};
class Even:public Function
{
public:
Even()
{
successor=NULL;
}
Function *successor;    
void setSuccessor(Function *f)
{
if (successor == NULL)
successor = f;
else
successor->setSuccessor(f); 
}
void Start(int value)
{
//prime function
cout<<"I am Even Functionn";
//if successor !=null
//  call successor
if(successor!=NULL)
successor->Start(value);
}
};
class Pipeline
{
public:
Function *function;
void addToPipe(Function* function)
{
if(this->function==NULL)
this->function=function;
else
function->setSuccessor(function);
}
void start(int value)
{
function->Start(value);
}
};
int main()
{
Pipeline pipe;
pipe.addToPipe(new Prime());
pipe.addToPipe(new Even());
pipe.start(5);
}

在这个程序中,我首先堆叠了Prime,然后堆叠了Even。我希望我的函数素数开始然后甚至开始。由于没有添加其他函数,因此它应该在 Even 之后停止。此程序有运行时错误。请帮我检测它们

在你的程序中发现了两个缺陷(可以推理为简单的拼写错误(:

  1. Pipeline::function永远不会初始化,因此它具有一些垃圾值,这会导致在取消引用它时出现未定义的行为(例如崩溃(。只需将其初始化为NULL或最好是nullptr,就像您在其他两个类中所做的那样。

  2. Pipeline::addToPipe你忘记了一个this

    void addToPipe(Function* function)
    {
    if(this->function==NULL)
    this->function=function;
    else
    function->setSuccessor(function); // Calls setSuccessor on the local variable!!
    } 
    

修复这两个后,我收到了(预期的(输出

I am Prime Function
I am Even Function

为此,您可以使用标准库模板,避免编写自己的类。例如

# include <iostream>
void prime(int) { cout << "Prime" << endl; }
void even(int) { cout << "Even" << endl; }
...
#include <functional>
#include <vector>
std::vector<std::function<void(int)>> pipeline;
pipeline.push_back(prime);
pipeline.push_back(even);
...
for (const auto& f : pipeline) f();

请注意,将名为"prime"和"even"的函数返回void似乎很奇怪。

最新更新