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

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

Пример (поскольку я не могу размещать здесь настоящий исходный код...)
main

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

RandomClass 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-><<???


person g19fanatic    schedule 09.05.2011    source источник


Ответы (3)


Сначала разыменуйте указатель

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

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

RandomClass::RandomClass() : m_refLog(NULL) 
{
...
}
person asami    schedule 09.05.2011
comment
лучше проверьте, что он не равен нулю, и инициализируйте его значением null в конструкторе. - person Benoit; 09.05.2011

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

person Oliver Charlesworth    schedule 09.05.2011

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

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

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

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

void RandomClass::addText(const std::string& text) {
  (*m_refLog) << text;
}
person Lightness Races in Orbit    schedule 09.05.2011