оператор<< и ссылка на std::stringstream?

#c #std #stringstream

#c #std #stringstream

Вопрос:

У меня есть класс, который содержит ссылку на stringstream (используется в качестве общего журнала приложения). Как мне добавить текст в указанный stringstream?

Пример (поскольку я не могу опубликовать здесь фактический исходный код …)
основной

 stringstream appLog;
RandomClass myClass;
.....
myClass.storeLog(amp;applog);
myClass.addText("Hello World");
cout << appLog.str().c_str() << endl;
  

cpp случайного класса

 void RandomClass::storeLog(stringstream *appLog)
{
  m_refLog = appLog;
}

void RandomClass::addText(const char text[])
{
  m_refLog << text;    //help here...?
}
  

Я получаю следующую ошибку в моем реальном приложении, используя очень похожие настройки и структуру метода, как указано выше.
error C2296: '<<' : illegal, left operand has type 'std::stringstream *'
error C2297: '<<' : illegal, right operand has type 'const char [11]'

Я знаю, что ошибка в том, что я использую ссылку и все еще пытаюсь выполнить ‘<<‘, но как еще мне это сделать? m_refLog-><< ???

Ответ №1:

Сначала отмените ссылку на указатель

 void RandomClass::addText(const char text[])
{
    if ( m_refLog != NULL )
        (*m_refLog) << text;    
}
  

В конструкторе инициализируйте указатель-член на stringstream значением NULL

 RandomClass::RandomClass() : m_refLog(NULL) 
{
...
}
  

Комментарии:

1. лучше проверьте, что это значение не равно null, прежде чем инициализировать его равным null в конструкторе.

Ответ №2:

Похоже, что ваш m_refLog элемент является StringStream * (т.е. указателем на StringStream ), а не StringStream (или StringStream amp; . Это источник ваших ошибок компиляции.

Ответ №3:

У вас есть указатель, а не ссылка. Разыменуйте его, чтобы получить сам поток.

(Напомним, что это ptr->foo() эквивалентно (*ptr).foo() .)

Я бы также рекомендовал, чтобы ваши функции принимали const std::stringamp; вместо указателей на буферы в стиле C char буферы.

И .c_str() в вашем примере является избыточным.

 void RandomClass::addText(const std::stringamp; text) {
  (*m_refLog) << text;
}