[英]Static constructors in C++ on my own OS kernel
我正在尝试用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模块也发生了同样的事情。
因此,请帮助我解决此类问题。 请帮我。 任何帮助将不胜感激。 谢谢。
首先,您对cout
的实现不合格。 如果要编写C ++标准库,则必须编写它以符合所说的标准(而不是您认为的标准)。
其次,您需要实现静态构造函数支持。 您尚未指定编译器,因此我只能说出您的编译器将其静态构造函数初始化代码放在何处,并确保在程序启动时调用它。
与从头开始编写一个新的OS相比,将现有的C ++库(GCC的libstdc ++或clang的libc ++)适应新的操作系统可能要幸运得多。 对于初学者来说,编写C ++ stdlib并不是一件容易的事。 您将立即开始模板元编程。
不调用对象的构造函数就无法创建对象。 但是对于像cout
这样的全局变量,有时调用构造函数的时间是个问题。 如果在不同的.cpp文件中有两个全局变量,则无法预测将首先构造哪个全局变量。 也许这就是您遇到的问题? 如果是这样,那么简单的答案就是将所有全局变量放入一个.cpp文件(如果愿意,可以将其命名为globals.cpp)。 然后,将按照您在该.cpp文件中声明它们的顺序构造全局变量(并以相反的顺序进行销毁)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.