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++ で実現できますか。私が念頭に置いているユースケースは、次のようなルールのオンザフライ定義です。

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");
}

メイン.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();
}

問題は、目的の効果を達成するために「ここで何かを行う...」コメントで何をする必要があるかということです。

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 とラムダのサポートを確認することをお勧めします。それができない場合は、boost ライブラリを使用することもできますが、多くの名前付き使い捨てクラスを定義する必要があります。

于 2013-03-07T23:36:15.823 に答える