Как структурировать каркас приложения - PullRequest
0 голосов
/ 28 января 2010

Я хочу написать что-нибудь, что позаботится о:

Если возможно, цикл int main (), например, я хочу, чтобы код для основной функции находился в этом файле

Некоторые мирские задачи, такие как создание окон, инициализация различных вещей, таких как opengl, opencv и что нет.

Различные «события» (я цитирую, потому что я знаю, что такое концепция событий в c ++) для таких вещей, как события клавиатуры и мыши.

Предоставить доступ к соответствующим переменным-членам, таким как hDC.

Я хотел бы поместить этот код в один файл, который я могу просто вставить в новый проект, а затем получить что-то вроде App.cpp, который может реагировать на события по своему выбору, не требуя, чтобы он обрабатывал все из них.

Мой опыт работы на c #, и я только начинаю c ++. Я боюсь, что, возможно, я не сформулировал вопрос хорошо, но любая помощь будет признательна.


Edit: Я не ищу готовое решение. Я не слишком одержим этим, будучи одним файлом. Я заинтересован в механике того, как на самом деле создать структуру. Меня совсем не волнует кроссплатформенная совместимость

Ответы [ 4 ]

1 голос
/ 28 января 2010

Не существует конкретного шаблона проектирования для того, что вы ищете, но есть название: " framework " - в вашем случае более конкретно " приложение основа".

Фреймворки эффективно минимизируют работу, которую пользователи должны выполнять для настройки, реализуя поведение по умолчанию для общих задач.

Нет никакого полезного способа просто вставить один файл. Обычно вы компилируете фреймворк в (динамическую или статическую) библиотеку, на которую ссылается ваше приложение, но тогда вам все равно нужно включить необходимые заголовочные файлы.

1 голос
/ 28 января 2010

Посмотрите на Qt

0 голосов
/ 29 января 2010

Я отвечаю на свой вопрос здесь, но мне очень интересно услышать мысли об этой настройке. Идея состоит в том, что мой каркас находится в классе в MyApp.cpp (для краткости я игнорирую заголовочные файлы). Приложение создает метод main (), который инициализирует экземпляр MyApp. Связывает некоторые события (это не то, что я бы назвал событиями в смысле слова C #, потому что здесь может быть только один «подписчик», но в данном случае это не имеет значения), а затем вызывает метод Run для экземпляра приложения. Затем объект App отвечает за конструирование любых мирских вещей, таких как окна. Он запускает насос сообщений и при необходимости вызывает «события». Таким образом, приложение может нести ответственность за все мелочи и скрывать их от глаз.

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";
            }

        }
    }
};
0 голосов
/ 28 января 2010

Для этого нет шаблона проектирования. То, что вам нужно, это базовый уровень абстракции ОС, который избавит вас от необходимости прямого вызова операционной системы и объединит все в несколько классов C ++.

нитиализируя различные вещи, такие как opengl, opencv и что нет

Это вместе с int main() loop заставляет меня думать, что вы на самом деле ищете игровой движок или базовую основу для создания компьютерных игр / для работы с графикой. Если это правда, почему бы не взглянуть на SDL, SFML, Ogre, что бы ни соответствовало вашим потребностям? Все предоставляют базовую абстракцию и многое другое для разных целей.

Кроме того, большая часть ваших требований уже обрабатывается различными утилитами OpenGL, а именно GLUT и GLFW. Если вы намереваетесь придерживаться OpenGL, оба будут делать свою работу (GLFW более продвинут и обеспечивает больший контроль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...