Перегрузка оператора ostream << для статического класса? - PullRequest
1 голос
/ 11 ноября 2009

У меня есть (упрощенный) статический глобальный класс и перегрузка оператора << следующим образом: </p>

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

Тем не менее, оператор << хочет экземпляр, но экземпляров этого глобального класса на самом деле не существует. Есть ли что-нибудь вокруг этого? </p>

Спасибо за любую помощь.

Ответы [ 3 ]

4 голосов
/ 11 ноября 2009

Прежде всего, вы не можете использовать имя класса в качестве значения - оно просто не одно. Поэтому вам нужно ввести другое имя для использования с << - скажем, 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 голос
/ 11 ноября 2009

Синглтон .

Вот один из способов реализации шаблона на вашем примере (без проверки ошибок):

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()
0 голосов
/ 11 ноября 2009

Если вы действительно хотели бы вызвать такую ​​функцию без экземпляра объекта, вы могли бы сделать это так:

std::cout << *(Global*)NULL;

Но уже предложенный шаблон синглтона - гораздо лучшая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...