C++ 如何构造应用程序框架

C++ 如何构造应用程序框架,c++,visual-c++,C++,Visual C++,我想写些东西来处理: 如果可能,使用int main()循环,如中所示,我希望主函数的代码位于该文件中 一些普通的任务,比如创建窗口,初始化各种东西,比如opengl,opencv等等 各种事件(我引用,因为我对事件的C++概念是什么),比如键盘和鼠标事件。 提供对相关成员变量(如hDC)的访问 我想把这段代码放在一个文件中,我可以把它放到一个新项目中,然后有一个类似App.cpp的东西,它可以根据自己的选择响应事件,而不需要处理所有事件 我的背景是C语言,我才刚刚开始C++。我担心我可能没有很

我想写些东西来处理:

如果可能,使用int main()循环,如中所示,我希望主函数的代码位于该文件中

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

各种事件(我引用,因为我对事件的C++概念是什么),比如键盘和鼠标事件。

提供对相关成员变量(如hDC)的访问

我想把这段代码放在一个文件中,我可以把它放到一个新项目中,然后有一个类似App.cpp的东西,它可以根据自己的选择响应事件,而不需要处理所有事件

我的背景是C语言,我才刚刚开始C++。我担心我可能没有很好地表达我的问题,但任何帮助都将不胜感激


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

这方面没有设计模式。您所要寻找的是一个基本的操作系统抽象层,以节省您直接调用操作系统的努力,并将一些东西捆绑在几个C++类中。 初始化各种东西,比如opengl、opencv等等

<>这与<代码> int()循环<代码>使我认为你实际上是在寻找一个游戏引擎或者是一个基本的基础来制作计算机游戏/做与图形相关的东西。如果这是真的,为什么不看看SDL,SFML,Ogre,任何适合你需要的东西呢?所有这些都提供了基本的抽象和更多,用于不同的目的


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

对于您正在寻找的东西,没有特定的设计模式,但有一个名称:“-在您的情况下更具体地说”“

框架通过实现常见任务的默认行为,有效地最小化了其用户在设置方面所做的工作


但是,没有什么有用的方法可以只插入一个文件。您通常要做的是将框架编译到一个(动态或静态)库中,您的应用程序将链接到该库,但您仍然需要包含必要的头文件。

请看

我在这里回答我的问题,但我非常感兴趣地听到有关此设置的想法。我的想法是,我的框架位于MyApp.cpp中的一个类中(为了简洁起见,我忽略了头文件)。应用程序构造它的main()方法初始化MyApp的一个实例。连接一些事件(这些不是我所谓的C#意义上的事件,因为这里只能有一个“订户”,但在本例中这并不重要),然后在应用程序实例上调用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”
使用名称空间std;
MyApp;
接收到无效数据(字符串txt)
{

难道我不想使用GLUT或类似的东西,因为我想1.自己构建这个2.我想让它专门为我的想法工作。只是默默地改变问题的焦点并不完全是好的风格;)
#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";
            }

        }
    }
};