【问题标题】:Interface for library c++库 C++ 的接口
【发布时间】:2013-11-08 04:10:06
【问题描述】:

我需要创建子弹抛物线飞行的模拟(简单矩形),条件之一是在自制库中进行所有计算并为其创建接口(抽象类)。 我很困惑如何实现这个:

  • 制作完全抽象的类和几个函数(不是在 class) 将通过“get()”和“set()”使用类?
  • 使用他的方法中实现的所有计算来创建类,并且只需 让一种“绘制”方法成为纯虚拟方法?

我正在使用 WinAPI,所有图形都通过 GDI

非常感谢您的帮助

【问题讨论】:

  • c++ 中提供一个“接口”通常意味着提供一个完全抽象的类,其所有方法都定义为纯virtual。另一种选择是创建一组模板类/函数,这些模板类/函数只使用(假定实现)模板类型上的操作(提供 'interface')。

标签: c++ winapi gdi


【解决方案1】:

您创建类的目的之一是将所有不相关的数据和操作分离到不同的类。

在您的情况下,一部分是计算,另一部分是结果布局。

因此,实现它的最佳方法是定义一个提供所有计算和访问结果的类,并实现绘图功能,该功能将使用您的计算类的对象。

因此,它可以在其他环境(例如,在您的其他项目中)使用您的计算,而无需更改任何代码,这是很自然的。它将提供与平台无关的计算代码的可移植性。

而布局部分,依赖于平台,应该单独实现,只使用计算类提供的接口。

    class Trajectory
    {
    public:
         // Constructor, computation call methods
         // "GetResult()" function,
         //     which will return trajectory in the way you choose
         ...
    private:
         // computation functions
    };

    // somewhere else
    void DrawTrajectory(Trajectory t)
    {
        // here is a place for calling all winapi functions
        //     with data you get using t.GetResult() 
    }

如果需要抽象类,你应该从抽象类继承 Trajectory 类, 您将在其中定义必须调用的所有函数。

在这种情况下

    //
    class ITrajectory
    {
    public:
       // virtual /type/ GetResult() = 0;
       // virtual /other methods/
    };

    class Trajectory : public ITrajectory
    { 
       // the same as in previous definition
    };

    void DrawTrajectory(ITrajectory T)
    {
        // the same as in previous definition
    }

【讨论】:

    【解决方案2】:

    当您将 Windows、库和抽象类作为接口讨论时,我想知道您是否正在考虑在 DLL 之间共享类。

    有一个declspec(dllexport) 关键字,但是在类和/或类成员上使用它是不好的。您最终会得到所有库代码紧密耦合并完全依赖于对所有内容使用相同的编译器版本和设置。

    例如,一个更好的选择是传递接口指针,它允许您一次升级一个 DLL 的编译器。这里的关键是库的使用者对类布局一无所知。该接口没有描述可能被内联的数据成员或非虚拟函数。接口中只出现了公共虚函数,这只是公共头中定义的一个类。

    DLL 具有继承自接口的实际实现。消费者拥有的只是虚函数表和一个工厂(普通的旧 C 兼容函数),它返回一个指向新对象的指针。

    如果您这样做,您可以以任何您喜欢的方式更改实现,而无需更改消费者所依赖的二进制接口,因此它们无需重新编译即可继续工作。这是 COM 对象在 Windows 中如何工作的基础。

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 2010-12-18
      • 2013-05-07
      • 2011-04-22
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多