在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();
}
问题是,我需要做些什么才能达到预期的效果?
答案 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支持。如果这不是一个选项,你可以使用一些升级库,但你可能需要定义一些命名的一次性类。