Эмулятор для представления аппаратных и операционных системах


Это эмулятор я в настоящее время переписывания на мой курс операционных систем. Это простой эмулятор, который, как предполагается, представляет аппаратного обеспечения, операционной системы и т. д. Это строго для целей обучения, и я хочу предложить мое решение учителя как метод современный C++ (поскольку его решения более "C с классами").

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

Прямо сейчас я обсуждаю в моей ассоциации между аппаратными средствами и операционной системы. Они сейчас написано вот так:

// Hardware.h
class OS;
class Hardware : boost::noncopyable
{
    friend class OS;

private:
    Hardware(OS *os);

    void load_job(boost::shared_ptr<Job> job);
    void run_job();

private:
    void execute_instruction(Instruction const& instruction);
    void handle_interrupt(Instruction const& trap);

private:
    enum { NumberOfRegisters     = 32 };
    enum { InstructionMemorySize = 1024 };
    enum { DataMemorySize        = 1024 };

    OS                            *m_pOS;

    std::vector<int>               m_Registers;
    boost::ptr_vector<Instruction> m_InstructionMemory;
    std::vector<int>               m_DataMemory;

    boost::optional<int>           m_Counter;
};


// OS.h
class Hardware;
class OS : boost::noncopyable
{
    friend class Hardware;

public:
    OS();

    // Load jobs
    void boot();
    // Execute jobs
    void run();

private:
    // "Interrupts"
    void trap_halt(int status);
    void trap_getw(int& receiver);
    void trap_putw(int value);
    void trap_dump();

    void time_elapsed();

private:
    void get_next_job();

private:
    boost::scoped_ptr<Hardware> m_pHardware;
    boost::scoped_ptr<Parser>   m_pParser;

    boost::ptr_deque<Job>       m_Jobs;
    boost::ptr_deque<Job>       m_JobsInProgress;
};

Вопрос: я не хочу скобяными , чтобы быть доступными для любого другого класса, чем другие ОС. Объявления Оборудование частных и дружественности ОС-это шаг в правильном направлении, но меня беспокоит то, что ОС теперь имеет доступ ко всем функциям. Есть ли способ я могу ограничить ОС?

Также, я сделал некоторые исследования на обратные вызовы, но в C++ часто задаваемые вопросы говорит о том, что вы не должны делать обратные вызовы функций-членов класса. Существуют ли другие решения, такие, что моя скобяными классу не нужен указатель на ОС для вызова его функции?

Во-вторых, мне интересно, в какой момент идиома Pimpl идиома стать жизнеспособным решением? Я имею в виду, как большому классу должны быть, или сколько включает в себя, должен он иметь, чтобы серьезно рассмотреть вопрос о переносе класса в структуре?



519
10
задан 16 мая 2011 в 01:05 Источник Поделиться
Комментарии
1 ответ

Это не то, что друзья для. Друзья тесно интегрированных классов, которые должны быть в состоянии играть с личные данные друг друга. Операционной системы и аппаратного обеспечения не плотно взаимосвязаны; они взаимодействуют через специально разработанный интерфейс.

Если вы не хотите, чтобы другие классы кроме ОС для вызова функции оборудования, не пишите код в тех других классов, которые требуют аппаратной функции. А еще лучше, просто дать указатель оборудования для класса ОС, поэтому только оно может вызвать аппаратные функции.

Для обратных вызовов взгляните на повышение::библиотека функций. Это позволит вам создавать обратные вызовы методов ОС. Можно создавать указатели на методы, но вам нужно как указатель на метод и точка объекта для его работы. В Boost::функция скрывает все это за кадром.

идиома Pimpl решение, потому что c++ - Это такой глупый язык. Его цель-сделать так, что вам не придется перекомпилировать файл заголовка всякий раз, когда частным членам класса изменение. Более современные языки, по сути, делать это автоматически для всех классов. интеллекту имеет смысл только тогда, когда время компиляции были слишком большими. Проект класса, вероятно, не получают достаточно большие для того, чтобы быть большой интерес.

8
ответ дан 16 мая 2011 в 02:05 Источник Поделиться