#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;
}