2

我正在尝试用 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在 OStream.cpp 文件本身中创建了一个类对象。但是,如果我在我的主模块中创建一个对象,那么它会成功调用其构造函数,但随后cout无法正常工作。

这意味着如果我显式地创建一个对象,它可以完美地工作,但是我如何才能隐式地创建一个对象。

我的 Interrupt.cpp 模块也发生了同样的事情。

所以请帮我解决这类问题。请帮我。任何帮助将不胜感激。谢谢你。

4

2 回答 2

2

首先,您的实施cout不符合要求。如果您要编写 C++ 标准库,则必须将其编写为符合所述标准(而不是您认为的标准)。

其次,您需要实现静态构造函数支持。你还没有指定你的编译器,所以我只能说找出你的编译器把它的静态构造函数初始化代码放在哪里,并确保在程序启动时调用它。

将现有的 C++ 库(GCC 的 libstdc++ 或 clang 的 libc++)适应您的新操作系统可能比从头开始编写一个更幸运。编写 C++ 标准库不是初学者的事。您很快就会深入了解模板元编程。

于 2011-08-27T19:09:54.507 回答
-1

如果不调用它的构造函数,就不可能创建一个对象。但是对于全局变量,cout有时调用构造函数的时间是一个问题。如果您在不同的 .cpp 文件中有两个全局变量,那么您无法预测首先构造哪个全局变量。也许这就是你看到的问题?如果是这样,那么简单的答案是将所有全局变量放入一个 .cpp 文件中(如果您愿意,可以将其称为 globals.cpp)。然后全局变量将按照您在该 .cpp 文件中声明它们的顺序构建(并以相反的顺序销毁)。

于 2011-08-27T19:25:25.417 回答