在C ++中即时定义函数

时间:2013-03-07 23:29:16

标签: c++ interface c++-cli implementation

在C ++中,是否可以在另一个类中实现一个类的功能(除了依赖之外不相关)类的功能?我正在寻找的行为可以使用抽象方法和/或在匿名内部类中实现的接口在Java中实现,如下所示:

Interface IFoo{

public void doFoo();

}

Class Bar {
private IFoo impl;
public Bar(IFoo implArg){
    impl = implArg;
}


}
static void main(String[] args) {
Bar myBar = new Bar(new IFoo(){
    @Override
    public void doFoo(){
        System.out.println("hello foo impl!");
    }
});
}

在C ++中可以实现同样的效果,如果是这样,怎么样?我想到的用例是规则的动态定义,如下所示:

AbstractRule.h

#ifndef _ABSTRACT_RULE_H_
#define _ABSTRACT_RULE_H_

#include <stdio.h>

class AbstractRule{
private:

public:
AbstractRule();
~AbstractRule();
void enforceAbstractRule();
};

#endif

AbstractRule.cpp

#include "AbstractRule.h"
AbstractRule::AbstractRule(){
}
AbstractRule::~AbstractRule(){
}

void AbstractRule::enforceAbstractRule(){
printf("placeholder impl of enforceRule-- should not see this in production");
}

Main.cpp的

#include "AbstractRule.h"

int main(int argc, char** argv){
AbstractRule myRule;
//do something here so that myRule.enforceAbstractRule() call prints "enforced 
    //myRule!"
myRule.enforceAbstractRule();
}

问题是,我需要做些什么才能达到预期的效果?

2 个答案:

答案 0 :(得分:3)

Java有一个名为“无名类”的东西,这就是你的例子所使用的 - 请注意你的“概念”稍微“错误”,因为你实际上并没有“在运行中”声明一个函数,你宣称一个新的班级“在飞行中”。

在C ++中,所有类都必须有一个名称[1]。

因此,对于您想要做的事情,您需要声明一个扩展基类的类:

class MyRule : public Rule
{
   void enforceRule();
};


void MyRule::enforceRule()
{
   ... stuff goes here ... 
}

您当然可以将声明inline放在类声明中。但为了能够使用它,你需要给它一个名字。

现在,您的主要人物将:

MyRule myRule;

[或者,更有可能的是,您调用工厂函数来选择“正确的”规则类,创建一个新对象,并返回指向该对象的指针]

[1]总是不严格,但对于这种特殊用途,你需要一个类名。

答案 1 :(得分:2)

如果您感兴趣的是一个可定义内联的小函数,那么您将需要查看在C ++ 11中添加的std :: function和lambda支持。如果这不是一个选项,你可以使用一些升级库,但你可能需要定义一些命名的一次性类。