【发布时间】:2023-03-08 00:19:01
【问题描述】:
我正在尝试用 c++ 编写内核,并且我是操作系统开发的初学者。现在我正在实现cout 在显示器上显示,但我遇到了一些问题。我知道我问的问题很愚蠢,但我也是 C++ 的新手。
我写了一个 OStream 类,它调用系统函数write 在屏幕上显示。它的基类是我的 Video 类。此类包含在命名空间 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.cpp 文件本身中创建了一个 OStream 类的对象。
但是如果我在我的主模块中创建一个对象,那么它会成功调用它的构造函数,但是cout 不起作用。
这意味着如果我显式创建一个对象,它可以完美运行,但我如何才能隐式创建一个对象。
我的 Interrupt.cpp 模块也在发生同样的事情。
所以请帮我解决这类问题。 请帮我。 任何帮助将不胜感激。 谢谢。
【问题讨论】:
-
你说你是内核开发和C++的新手。两者都非常复杂。我建议您一次只专注于一个。先学C++,再搞内核。
-
在编写自己的内核时,我也考虑过使用 C++,但这真的不值得额外的麻烦。无论如何,在中断工作、分页支持、内核堆等之前,你不能在开始时使用任何标准库(C 或 C++)。所以这必须与语言的基本功能一起工作(这对于 c 和 c++ 基本相同)。稍后您可以轻松地将这两个库移植到您的内核中,但这确实不是您现在应该担心的事情。
标签: c++ operating-system kernel osdev