我有一个(简化的)静态全局类和<<运算符重载如下:
class Global
{
private:
static int counter;
Global(){};
public:
friend ostream& operator<<(ostream &out, Global &global);
}
ostream& operator<< (ostream &out, Global &global)
{
//... do output
return out;
}
我希望能够将静态引用传递给cout:
cout << Global
然而,&lt;&lt; operator需要一个实例,但实际上并不存在这个全局类的实例。反正有吗?
感谢您的帮助。
答案 0 :(得分:4)
首先,你不能使用类名作为值 - 它根本就不是一个。因此,您必须为<<
引入一个不同的名称 - 例如global
(小写“g”)。
通常,如果要在不定义对象的情况下引入“可流式”名称,则应编写流操纵器:
std::ostream& foo(std::ostream& out)
{
out << "foo";
return out;
}
这里的技巧是流重载了运算符<<
,这样,如果你传递一个函数指针,并且该函数接受并返回一个流,那么<<
将等同于应用功能到流。换句话说,你可以写:
std::cout << 123 << foo << 456;
它将与:
相同foo(std::cout << 123) << 456;
例如,std::endl
是如何实现的。
同样的事情也适用于>>
,如果您希望它更通用,您可以在basic_istream
和/或basic_ostream
上提供模板功能。
答案 1 :(得分:1)
这是您在实例中实现模式的一种方式(未检查错误):
class Global
{
private:
static int counter;
Global(){};
static Global *_instance;
public:
static Global getInstance() {
if (!_instance)
_instance = new Global();
return *_instance;
}
friend ostream& operator<<(ostream &out, Global &global);
}
Global* Global::_instance = NULL;
ostream& operator<< (ostream &out, Global &global)
{
//... do output
return out;
}
然后你的调用代码如下:
cout << Global::getInstance()
答案 2 :(得分:0)
如果真的想要在没有对象实例的情况下调用这样的函数,你可以这样做:
std::cout << *(Global*)NULL;
但是已经提出的单身模式是一个更好的主意。