所以我一直在研究静态函数,指针和typedef,并且碰到一堵砖墙,想知道是否有人可以提供一些见识。

我有一个带有Utilsstatic ofstreamtheLog,还有另一个使用WorkUtils::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时,如下所示:l << "Hello, world!\n";我收到编译器错误。我假设原因是运算符<<优先于*,即使l的类型为pOfStream,其类型被定义为指向ofstream对象的指针,但是该代码不是隐式编写的*l << "Hello, world!\n";

我的问题是,有没有一种方法可以使用提取运算符<<而不用用圆括号和星号将指针引起来?同样,当您定义类似上面的pOfStream的类型,然后将变量var分配给pOfStream类型时,编译器是否仅读取了代码并将pOfStream的任何实例替换为ofstream*

我一直在搜索SO和Google寻找答案,但我不确定如何表达问题。

最佳答案

您为什么不只引用流,例如

ostream &l = Utils::theLog;
l << "Hello, World!\n";

这样,您不必使用指针。

08-26 19:40