设计建议:从包含的对象调用容器对象上的方法

Jul*_*lik 1 c++ oop composition

我有一个简单的设置

class Container {
    Handler h;
}
Run Code Online (Sandbox Code Playgroud)

所有Container对象都有一个"warning()"方法.我想有一种方法从Handler对象中输出警告,但是使用包含对象的工具发送这些警告.

我确实意识到在包含的对象中持有对容器的引用是奇怪的(通常包含的对象不应该知道它的容器的任何内容).现在,在一个带闭包的语言中我会这样做(假想的语法):

h.set_warning_handler { | char* message |
    this->warning(message)
}
Run Code Online (Sandbox Code Playgroud)

但我在C++工作,它不是一个像块一样使用Apple方言的地方.解决这个问题的首选方法是什么?或者只是设置参考并忘记它?

Kon*_*lph 5

C++ 11有闭包:

h.set_warning_handler([&](char const* message) { this->warning(message); });
Run Code Online (Sandbox Code Playgroud)

[&]指定通过引用捕获上下文(需要捕获this).(…)声明参数列表和{…}lambda的主体.

另外,您也可以使Handler依赖其容器上.这引入了非常强大的耦合,因此最好避免使用它,但有时它是有意义的(例如,如果你还不能使用C++ 11特性),并且通过使用接口可以削弱强耦合(以下使用后期绑定;有时候,模板可能更合适):

struct CanWarn {
    virtual void warning(char const*) const = 0;
    virtual ~CanWarn() { }
};

class Handler {
    CanWarn const* warning_dispatcher;

public:

    void set_warning_dispatcher(CanWarn const* dispatcher) {
        warning_dispatcher = dispatcher;
    }

    …
};

class Container : public CanWarn { … };
Run Code Online (Sandbox Code Playgroud)