【问题标题】:Storing and retrieving objects of unknown type without casts在不进行强制转换的情况下存储和检索未知类型的对象
【发布时间】:2012-07-25 15:25:34
【问题描述】:

给定:

A 类的对象包含一个对象数组。

这些对象中的每一个都必须实现一些接口 IB,因为 A 使用 IB 的方法。

这些对象由客户端传递给 A 类的对象,它们属于 C 类型或其子类。 A 必须将这些对象返回给客户端。

问题:A 必须对 C 一无所知,只知道 IB,但 A 必须返回 C。

在 C++ 中有没有不安全强制转换的标准解决方案?

【问题讨论】:

  • 听起来您在编写 Java 上花费了太多时间。 C++ 没有与class 分开的“接口”的概念。因此,IB 必须是一个类,并且 A 可以简单地将(指针|引用)返回到 IB。 C 必须(显然)从 IB 派生,但 A 不需要知道这一点。
  • 这个答案可能会给你一些想法:stackoverflow.com/questions/7950711/…
  • 你说 unsafe casts 好像static_cast 等是不安全的。如果使用得当,它们是绝对安全的。

标签: c++ oop design-patterns


【解决方案1】:

我认为 A 不知道关于 C 的任何事情是不可能的。然而,让A 知道足以使用正确的接口在 C++ 中并不难。让所有带有IB 的类都派生自一个抽象基类,其中接口定义为纯虚函数。这实际上对应于正确的 C++ 设计——将接口与实现分离——如 e.g. Sutter & Alexandrescu.

否则,如果上述方法确实不可能,您可以将A 设为模板类,并将数组元素存储为void*,使用static_cast 解析类类型(在编译时)。

【讨论】:

    【解决方案2】:

    您可以使用模板实现一个完全安全的类。

    template  <typename T>class A
    {
        std::vector<IB*> myObj;
    
    public:
    
    
        void add(IB* anObj)
        {
            myObj.push_back(anObj);
        }
    
        void get(int anIndex, T*& anObj)
        {
            T* t = dynamic_cast<T*>(myObj[anIndex]);
            anObj = t;
        }
    };
    

    然后像这样使用。

    A<C> a;
    

    演示给here

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多