1

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

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

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

非常感谢您的帮助

4

2 回答 2

1

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

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

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

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

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

于 2013-11-07T20:10:06.337 回答
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
    }
于 2013-11-07T19:08:30.183 回答