重载ostream<<静态类的运算符?

时间:2009-11-10 23:41:53

标签: c++ operator-overloading

我有一个(简化的)静态全局类和<<运算符重载如下:

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需要一个实例,但实际上并不存在这个全局类的实例。反正有吗?

感谢您的帮助。

3 个答案:

答案 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)

Singleton pattern

这是您在实例中实现模式的一种方式(未检查错误):

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;

但是已经提出的单身模式是一个更好的主意。