如何构建应用程序框架

时间:2010-01-27 23:48:09

标签: c++ visual-c++

我想写一些可以照顾的内容:

如果可能的话,使用int main()循环,我想要在这个文件中找到main函数的代码

一些平凡的任务,比如创建窗口,初始化各种东西,比如opengl,opencv等等。

各种“事件”(我引用因为我对事件的c ++概念是什么)对于键盘和鼠标事件这样的事情。

提供对相关成员变量的访问权限,例如hDC。

我想将此代码放在一个文件中,我可以将其放入一个新项目中,然后使用App.cpp之类的东西,它可以响应所选择的事件,而不需要它来处理所有这些事件。

我的背景是c#,我刚刚开始使用c ++。我担心我可能没有好好表达,但任何帮助都会受到赞赏。


编辑: 我不是在寻找预制解决方案。我不是太挂了它就是一个文件。我对如何实际创建框架的机制感兴趣。我完全不关心跨平台兼容性

4 个答案:

答案 0 :(得分:1)

没有针对您所寻找的具体设计模式,但名称为:software framework - 在您的情况下更具体地说是application framework

通过实现常见任务的默认行为,框架有效地最小化了用户必须做的工作。

虽然没有有用的方法可以删除一个文件。你通常做的是将框架编译成应用程序链接到的(动态或静态)库 - 但是你仍然需要包含必要的头文件。

答案 1 :(得分:1)

查看Qt

答案 2 :(得分:0)

没有设计模式。您正在寻找的是一个基本的操作系统抽象层,可以节省您直接调用操作系统的工作量,并将所有内容捆绑在一些C ++类中。

  

使用opengl,opencv和什么不是

等各种东西

这与int main() loop一起使我认为你实际上正在寻找一个游戏引擎或基本的基础来制作电脑游戏/与图形相关的东西。如果这是真的,为什么不看看SDL,SFML,Ogre,哪些适合您的需求?所有这些都提供了基本的抽象和更多,用于不同的目的。

此外,您的大部分要求已由各种OpenGL实用程序处理 - 即GLUT和GLFW。如果您打算坚持使用OpenGL,两者都可以完成这项工作(GLFW更先进并提供更多控制)。

答案 3 :(得分:0)

我在这里回答我的问题,但我很有兴趣听到有关此设置的想法。我的想法是我的框架位于MyApp.cpp中的一个类中(我为了简洁而忽略了头文件)应用程序构造其main()方法初始化MyApp的一个实例。连接一些事件(这些不是我在C#意义上所谓的事件,因为你在这里只能有一个“订阅者”,但在这种情况下它并不重要)然后在app实例上调用Run方法。然后,App对象负责构建像windows这样的平凡事物。它会使消息泵运行并根据需要调用“事件”。通过这种方式,应用程序可以负责所有单调的内容并将其隐藏起来。

Main.cpp的

#include <iostream>
#include <string>
#include "MyApp.cpp"

using namespace std;

MyApp app;

void DataReceived(string txt)
{
    cout << app.SomeSetting << ": " <<  txt << "\n";
}

int main(void)
{    
    //Initialize events and what not.
    app.OnDataReceived = DataReceived;

    app.Run(); //Run the app

    cout << "Goodbye\n";


    return 0;
}

MyApp.cpp中

#include <iostream>

using namespace std;

//Event signatures
typedef void (*DataReceivedEvent)(string);

class MyApp
{
public:
    //Events
    DataReceivedEvent OnDataReceived;

    //Settings
    int SomeSetting;

    void Run()
    {
        SomeSetting = 123;

        //Main loop
        int input;
        bool isRunning = true;
        while(isRunning)
        {
            cout << "Enter a command: ";
            cin >> input;

            switch (input)
            {
            case 0:
                isRunning = false;
                break;
            case 1:
                OnDataReceived("Command 1");
                break;
            default:
                cout << "What???\n";
            }

        }
    }
};