所以我一直在玩弄静态,指针和typedef,我碰到了一堵砖墙,想知道是否有人可以提供一些见解。
我有一个Utils
课程,其中static ofstream
名为theLog
我有另一个课程Work
使用Utils::theLog
。这是相关的代码:
#ifndef UTILS_H
#define UTILS_H
// includes
class Utils {
public:
static ofstream theLog;
// other code
}
#endif
// includes
typedef ofstream* pOfStream;
static pOfStream l = &(Utils::theLog); // l is a lowercase L
// constructor and destructor
void Work::doSomeWork() {
(*l) << "Hello, world!\n";
}
// other code
这会编译并且不会产生运行时错误。但是,定义pOfStream
的原因是用星号,括号和Utils::theLog
来消除我的代码填充。当我尝试使用(*l)
替换l
时,如{:1}}中出现编译错误。我假设原因是运营商l << "Hello, world!\n";
优先于<<
,即使*
属于l
类型,也被定义为指向pOfStream
对象的指针,但代码未隐式写入ofstream
。
我的问题是,有没有办法使用提取运算符*l << "Hello, world!\n";
而不必用括号和星号括起指针?此外,当您定义类似上述<<
的类型,然后将变量pOfStream
分配给类型var
时,编译器是否只读取代码并替换pOfStream
的任何实例} pOfStream
?
我一直在搜索SO和Google的答案,但我不确定如何说出这个问题。
答案 0 :(得分:4)
为什么不直接引用流,例如
ostream &l = Utils::theLog;
l << "Hello, World!\n";
通过这种方式,您不必使用指针。