首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库c++接口

库c++接口
EN

Stack Overflow用户
提问于 2013-11-07 18:43:39
回答 2查看 524关注 0票数 1

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

  • 通过"get()“和"set()”使完全抽象类和两个函数(不是类中的方法)使用类?
  • 用他的方法实现的所有计算的类,并使一个“绘制”方法纯虚拟?

我使用的是WinAPI,所有的图形都是通过GDI

我会非常感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2013-11-07 19:08:30

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

在您的例子中,一部分是计算,另一部分是结果布局。

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

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

而与平台相关的版图部分,则应分别使用由计算类提供的接口来实现。

代码语言:javascript
复制
    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() 
    }

如果需要抽象类,则应该从抽象类继承弹道类,在抽象类中定义必须调用的所有函数。

在这种情况下

代码语言:javascript
复制
    //
    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
    }
票数 1
EN

Stack Overflow用户

发布于 2013-11-07 20:10:06

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

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

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

DLL具有从接口继承的真正实现。使用者所拥有的只有虚拟函数表和一个工厂(普通的C兼容函数),它返回指向新对象的指针。

如果这样做,您可以在不更改使用者所依赖的二进制接口的情况下以任何方式更改实现,这样他们就可以继续工作而不需要重新编译。这是COM对象在Windows中工作的基础。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19844087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档