我正在尝试用c ++编写内核,我是OS开发的初学者。现在我正在实施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模块中。
所以请帮我解决这类问题。 请帮我。 任何帮助将不胜感激。 谢谢。
答案 0 :(得分:2)
首先,cout
的实施不符合要求。如果你要编写一个C ++标准库,你必须编写它以符合所述标准(而不是你认为标准是什么)。
其次,您需要实现静态构造函数支持。你还没有指定你的编译器,所以我只能说出编译器放置静态构造函数初始化代码的位置,并确保在程序启动时调用它。
您可能有更多的运气将现有的C ++库(GCC的libstdc ++或clang的libc ++)改编为新的操作系统,而不是从头开始编写。编写C ++ stdlib不适合初学者;你很快就会进行模板元编程。
答案 1 :(得分:-1)
在不调用它的构造函数的情况下创建对象是不可能的。但是对于像cout
这样的全局变量,有时构造函数被调用的时间是个问题。如果在不同的.cpp文件中有两个全局变量,则无法预测将首先构造哪个全局变量。也许那是你看到的问题?如果是这样,那么简单的答案是将所有全局变量放入一个.cpp文件中(如果愿意,可以将其称为globals.cpp)。然后全局变量将按照您在.cpp文件中声明它们的顺序构建(并以相反的顺序销毁)。