C++代理类

标签 c++ design-patterns

有什么方法可以轻松地在 C++ 中实现代理类模式?不使用 AspectC++ 或其他重型工具,仅使用内置宏或模板。

解释我想要什么:

class base_class
{
  public:
   virtual void method_one() { ... }
   virtual void method_two() { ... }
}

class class_proxy : base_class
{
   protected:
    void before_any_method_call() { do stuff };
    void after_any_method_call(std::exception* ex) { do stuff }
}

这是场景。我要代理的类 (base_class) 进行远程调用,但是当网络出现故障时,它将抛出从 std::exception 派生的传输异常。 base_class 有很多方法,我想捕获传输异常,以空结果响应,并在下一个方法调用之前重新建立连接。

最佳答案

如果您指的是通过反射之类的东西自动生成的东西,则不是。实现简单代理的一种常见方法是覆盖代理类的 operator->。如果你需要在代理中做的任何事情都可以在那个时候完成,这就有效。该技术在 GoF 的“设计模式”中,在实现部分下。

编辑(根据您的附加信息):如果您想在每次调用之前做一些事情,operator->() 重载机制很适合这个。在每次调用后做一些事情并不容易自动化,但我可以想象一些东西是用一个特殊的返回对象构建的,在它析构时调用它。

关于C++代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718901/

相关文章:

c++ - 一个简短的编程难题

c++ - 我们能否在运行时确定两个 type_info 是否可转换?

java - 如何以 OO 方式实现一个简单的场景

c++ - Windows:如何查询低级键盘 Hook 中修改键的状态?

c++ - 如何在 C++ Builder 中显示更长时间的工具提示?

c++ - 在 Cppcheck 中处理 "incompatibily"重载名称

silverlight - MVVM:模型 View 如何与数据模型通信

node.js - 如何处理在我想要的之前返回的异步代码?

c# - Unity - 访问其他脚本的变量 - 正确放置

angularjs - AngularJS 适合 (3) 层架构吗?