2

在 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++ 中可以实现同样的效果吗?如果可以,如何实现?我想到的用例是动态定义规则,如下所示:

抽象规则.h

#ifndef _ABSTRACT_RULE_H_
#define _ABSTRACT_RULE_H_

#include <stdio.h>

class AbstractRule{
private:

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

#endif

抽象规则.cpp

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

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

主文件

#include "AbstractRule.h"

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

问题是,我需要在“在这里做点什么......”评论中做什么才能达到预期的效果?

4

2 回答 2

3

Java 有一个叫做“无名类”的东西,这是您的示例使用的 - 请注意,您的“概念”有点“错误”,因为您实际上并没有“动态”声明一个函数,而是“在”声明一个新类苍蝇”。

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

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

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


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

当然,您也可以将声明inline放在类声明中。但是要让它可以使用,你需要给它一个名字。

现在,你的主要将有:

MyRule myRule;

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

[1] 并非总是如此,但对于这种特殊用途,您确实需要一个类名。

于 2013-03-07T23:39:10.347 回答
2

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

于 2013-03-07T23:36:15.823 回答