Рассмотрим следующий интерфейс:
class MyInterface
{
virtual bool test(void * param) = 0;
}
Может ли что-то подобное сделать для реализации интерфейса?
MyInterfacemyInterface = new MyInterface()
{
bool test(void * param)
{
return true;
}
}
myClass.setInterface(myInterface);
----- OR -----
myClass.setInterface( new MyInterface()
{
bool test(void * param)
{
return true;
}
} );
PS: этот метод сделан на Java. Интересно, что-то подобное существует в C ++.
Самая близкая вещь, которую вы можете получить к Java-эквиваленту встроенной реализации интерфейса, — это поместить приватный класс в ваш модуль компиляции:
#include "MyInterface.hpp"
namespace {
struct MyInterfaceImpl : public MyInterface {
virtual bool test(void * param)
{
return true;
}
};
}
И используйте его в другом месте этого файла (например, из локальных экземпляров стека).
Большую часть времени такой шаблон используется в Java для обработки событий / обратных вызовов. Если он близок к вашему варианту использования, рассмотрите что-то вроде этого:
class Widget {
std::function<void()> _callback;
void setCallback(std::function<void()> callback) { _callback = callback; }
void fireCallback() { if(_callback) _callback(); }
}
А в галактике далеко-далеко
int main() {
Widget *pw = new Widget();
auto callbackFunction = []() { alert("called back!"); } // C++ lambda
pw->setCallback( callbackFunction );
....
}
При необходимости этот экземпляр Widget может решить вызвать свой метод fireCallback, и вы увидите предупреждение («перезвонил!») На вашем экране.
Я предполагаю, что вы хотите сделать что-то похожее на то, что делается в Java, и создать какой-то анонимный класс, который используется только в одном месте.
Это не возможно в C ++ так же, как в Java.
Нечто похожее, что вы могли бы сделать, — это заставить ваш «интерфейс» (хотя он больше не будет таковым) использовать лямбды, которые указываются в момент, когда вы создаете экземпляр класса. Это не совсем то, что вы ищете, и не очень идиоматический C ++, но это можно сделать.
Строго говоря, в C ++ такой семантики нет. Если вы хотите передать интерфейс функции, вы берете указатель или ссылку на нее в качестве параметра и реализуете интерфейс в отдельном классе.
У вас будет одна из следующих функций-членов (после ваших имен)
myClass::setInterface(MyInterface* ptr);
//or
myClass::setInterface(MyInterface& ref);
а затем реализация
class MyInterfaceImpl : public MyInterface{
//Stuff
}
Затем вы можете передать указатель на MyInterfaceImpl
в setInterface
, но вы не можете определить реализацию на лету и передать это таким образом в функцию.
РЕДАКТИРОВАТЬ: Если вы хотите что-то близкое к этому поведению, рассмотрите вариант ответа πάντα ῥεῖ или реализуйте класс непосредственно перед созданием экземпляра и передачей его функции, хотя это довольно необычно в моем опыте и загромождает код определением локального класса)