Статические конструкторы в C ++ на моем собственном ядре ОС - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь написать ядро ​​на c ++, и я новичок в разработке ОС. Сейчас я использую cout для отображения на мониторе, но я столкнулся с некоторыми проблемами. Я знаю, что вопрос, который я задаю, глуп, но я тоже новичок в c ++.

Я написал класс OStream, который вызывает системную функцию write для отображения на экране. Его базовый класс - мой класс Видео. Этот класс входит в пространство имен std. Поэтому основная проблема заключается в том, что когда я создаю объект OStream, он не вызывает его конструктор и, следовательно, не вызывает конструктор его базового класса, так что видеомемория не инициализируется и, следовательно, на экране ничего не отображается.

Вот мой код:

/*OStream.h*/
namespace std{
class OStream:public Video{
    public:
    OStream();
    OStream& operator<<(int);
    OStream& operator<<(String);
    OStream& operator<<(char *cp);
    OStream& operator<<(char c);
    OStream& operator<<(unsigned char *cq);
    OStream& operator<<(unsigned char c1);
};
extern OStream cout;
}

/*OStream.cpp*/
namespace std{
    OStream cout;
    OStream::OStream(){}
    OStream& OStream::operator<<(char *cp){
        write(cp);
    }
    .
    . 
    .
    .
}

В приведенном выше коде я создаю объект класса OStream в самом файле OStream.cpp. Но если я создаю объект в своем главном модуле, он успешно вызывает его конструктор, но тогда cout не работает.

Это означает, что если я создаю объект явно, он работает отлично, но как я могу создать объект неявно.

И то же самое происходит с моим модулем Interrupt.cpp.

Так что, пожалуйста, помогите мне решить эту проблему. Пожалуйста, помогите мне. Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Во-первых, ваша реализация cout не соответствует.Если вы собираетесь писать стандартную библиотеку C ++, вы должны написать ее, чтобы она соответствовала указанному стандарту (а не тому, что вы считаете стандартом).

Во-вторых, вам нужнореализовать поддержку статического конструктора.Вы не указали свой компилятор, поэтому все, что я могу сказать, это выяснить, куда ваш компилятор помещает свой код инициализации статического конструктора, и не забудьте вызвать его при запуске программы.

Возможно, вам больше повезет, адаптируя существующий C ++библиотеки (libstdc ++ GCC или libc ++ Clang) для вашей новой ОС, чем писать с нуля.Написание stdlib на C ++ НЕ для новичка;Вы мгновенно погрузитесь в метапрограммирование шаблонов.

0 голосов
/ 27 августа 2011

Невозможно создать объект без вызова его конструктора. Но с глобальными переменными, такими как cout, иногда время вызова конструктора является проблемой. Если у вас есть две глобальные переменные в разных файлах .cpp, вы не можете предсказать, какая глобальная переменная будет создана первой. Может быть, это проблема, которую вы видите? Если это так, то простой ответ - поместить все ваши глобальные переменные в один файл .cpp (назовите его globals.cpp, если хотите). Затем глобальные переменные будут сконструированы в том порядке, в котором вы объявили их в этом файле .cpp (и уничтожены в обратном порядке).

...