C++ stringstream的第一个字符串参数保存为指针/垃圾
可能重复:C++ stringstream的第一个字符串参数保存为指针/垃圾,c++,pointers,stringstream,memory-address,C++,Pointers,Stringstream,Memory Address,可能重复: 我正在尝试使用stringstream构建一个字符串,就像使用cout一样。这是一个日志类。我遇到的问题是,如果的第一个参数似乎是实例化对象的方式的结果。我仍在调查中(同时您可能会得到更好的答案),但显式实例化对象效果很好: #include <iostream> #include <sstream> class StreamWriter { public: StreamWriter() {} ~StreamWriter() { std:
我正在尝试使用stringstream构建一个字符串,就像使用cout一样。这是一个日志类。我遇到的问题是,如果的第一个参数似乎是实例化对象的方式的结果。我仍在调查中(同时您可能会得到更好的答案),但显式实例化对象效果很好:
#include <iostream>
#include <sstream>
class StreamWriter {
public:
StreamWriter() {}
~StreamWriter() { std::cout << m_stringstream.str() << std::endl; }
std::stringstream m_stringstream;
};
int main (void) {
StreamWriter *sw = new StreamWriter();
sw->m_stringstream << "Hello " << "my " << "name is Pris ";
delete sw;
return 0;
}
并确保您的作用域保护命令,使其不会尝试创建多个sw
,并确保它在正确的时间被销毁,与您最初的尝试相同:
{ ORSDEBUG << "Hello " << "my " << "name is Pris"; }
{ORSDEBUG我已经尝试了几个替代方案,我唯一能做的就是这样:
#define OSRDEBUG(s) \
do \
{ \
StreamWriter writer; \
writer.m_stringstream << s; \
} while (0)
OSRDEBUG("Hello " << "my " << "name is Pris " << 123456);
#定义OSRDEBUG\
做\
{ \
流作者\
writer.m_stringstream老实说,我不太清楚到底发生了什么(这与您的StreamWriter
实例是临时实例有关),但我看到了与GCC和MSVC中描述的paxdiablo相同的效果
但是,这里有一些方法可以解决这个问题。将以下帮助程序添加到您的StreamWriter
类中:
ostream& get_ostream() {
return m_stringstream;
}
并将宏更改为:
#define OSRDEBUG (StreamWriter().get_ostream())
问题确实是,这条流是暂时的
在C++11之前,没有非成员的运算符感谢您花时间进行调查!我正在通过宏进行实例化,因为我需要调用析构函数。在我给出的示例代码中,我只是将消息的内容打印到std::cout,但我打算在析构函数中的某个点使用字符串执行其他操作,我希望这就是我为什么这么做的原因。+1感谢你打败了我。@Jon:我真不敢相信这个问题“没有答案”一个多小时。:@xeo:我也不能,但我有以前问过这个问题的好处;)@Matthieu:我觉得这个问题以前有人问过,我想我记得是你的问题。哦,看来你的问题也是重复的!:)太好了——谢谢你的回答!有什么理由不使用#定义OSRDEBUG吗td::cout
?@Xeo:啊,捕捉得很好,就在几周前,我也问了我的问题。不过,我已经“重定向”到了我的问题上,因为Nawaz在解释根本原因和解决问题方面做得很好。或者干脆做StreamWriter().flush()
。您已经有了一个返回ostream&
的函数,除此之外,它本质上是一个no op。没有理由编写新函数。
#define ORSDEBUG StreamWriter sw; sw.m_stringstream
{ ORSDEBUG << "Hello " << "my " << "name is Pris"; }
#define OSRDEBUG(s) \
do \
{ \
StreamWriter writer; \
writer.m_stringstream << s; \
} while (0)
OSRDEBUG("Hello " << "my " << "name is Pris " << 123456);
ostream& get_ostream() {
return m_stringstream;
}
#define OSRDEBUG (StreamWriter().get_ostream())
basic_ostream<Ch, Traits>& operator<<(void* p);