ostringstream 在插入输出后为空
ostringstream is empty after inserting output to it
我有一个奇怪的问题,即使我向它插入输出,ostringstream 还是空的。
这是我的代码:
//logger.h
#include <string>
#include <iostream>
#include <sstream>
using std::string;
class BasicLogger {
public:
BasicLogger(const string name);
BasicLogger(const BasicLogger& basicLogger);
~BasicLogger();
template<class T>
BasicLogger& operator<<(const T &msg){
std::cout << "msg is: " << msg << std::endl;
mBuf << msg;
std::cout << "mBuf is: " << mBuf.str() << std::endl;
return *this;
}
private:
string mName;
std::ostringstream mBuf;
};
class Logger {
public:
Logger();
~Logger();
BasicLogger info();
BasicLogger error();
private:
BasicLogger mInfoLogger;
BasicLogger mErrorLogger;
};
//logger.cpp
#include "logger.h"
BasicLogger::BasicLogger(const string name):
mName(name) { }
BasicLogger::BasicLogger(const BasicLogger& otherLogger) {
this->mName = otherLogger.mName;
this->mBuf << otherLogger.mBuf.rdbuf();
}
BasicLogger::~BasicLogger() { }
Logger::Logger():
mInfoLogger("[INFO]"),
mErrorLogger("[ERROR]") {}
Logger::~Logger() {};
BasicLogger Logger::info() {
return mInfoLogger;
}
BasicLogger Logger::error() {
return mErrorLogger;
}
//main.cpp
#include "logger.h"
int main() {
Logger logger;
logger.info() << "Hellooo";
}
输出为
msg is: Hellooo
mBuf is:
虽然@BoPersson 已经给了你解决方案,但我想解释一下这里发生了什么,以及为什么你的输出是空的,即使你在显示内容之前添加到 ostringstream
行.
我认为当您尝试按值 return mInfoLogger
时,编译器抱怨无法 return 它,因为复制构造函数已被删除。它被删除的原因是因为 ostringstream
您拥有的成员不可复制。
因此您提供了自定义复制构造函数并尝试以这种方式复制流:
this->mBuf << otherLogger.mBuf.rdbuf();
只有这样不会复制任何内容,因为您的 rdbuf
是空的,而是在
上设置 failbit
The failbit
The streambuf overload of basic_ostream::operator<< if the function
inserts no characters.
http://en.cppreference.com/w/cpp/io/ios_base/iostate
如果您要像这样检查您的消息插入:
if (!(mBuf << msg))
std::cout << "Not Inserted" << std::endl;
您会看到打印出 Not Inserted
消息。有很多方法可以让它打印出想要的信息。例如,确保您的 rdbuf
缓冲区不为空,或者在重用 mBuf
之前重置 failbit
,类似于 mBuf.clear();
或简单地通过 return参考 mInfoLogger
(和 mErrorLogger
)。然后你就可以安全地摆脱你的拷贝构造函数了。
我有一个奇怪的问题,即使我向它插入输出,ostringstream 还是空的。 这是我的代码:
//logger.h
#include <string>
#include <iostream>
#include <sstream>
using std::string;
class BasicLogger {
public:
BasicLogger(const string name);
BasicLogger(const BasicLogger& basicLogger);
~BasicLogger();
template<class T>
BasicLogger& operator<<(const T &msg){
std::cout << "msg is: " << msg << std::endl;
mBuf << msg;
std::cout << "mBuf is: " << mBuf.str() << std::endl;
return *this;
}
private:
string mName;
std::ostringstream mBuf;
};
class Logger {
public:
Logger();
~Logger();
BasicLogger info();
BasicLogger error();
private:
BasicLogger mInfoLogger;
BasicLogger mErrorLogger;
};
//logger.cpp
#include "logger.h"
BasicLogger::BasicLogger(const string name):
mName(name) { }
BasicLogger::BasicLogger(const BasicLogger& otherLogger) {
this->mName = otherLogger.mName;
this->mBuf << otherLogger.mBuf.rdbuf();
}
BasicLogger::~BasicLogger() { }
Logger::Logger():
mInfoLogger("[INFO]"),
mErrorLogger("[ERROR]") {}
Logger::~Logger() {};
BasicLogger Logger::info() {
return mInfoLogger;
}
BasicLogger Logger::error() {
return mErrorLogger;
}
//main.cpp
#include "logger.h"
int main() {
Logger logger;
logger.info() << "Hellooo";
}
输出为
msg is: Hellooo
mBuf is:
虽然@BoPersson 已经给了你解决方案,但我想解释一下这里发生了什么,以及为什么你的输出是空的,即使你在显示内容之前添加到 ostringstream
行.
我认为当您尝试按值 return mInfoLogger
时,编译器抱怨无法 return 它,因为复制构造函数已被删除。它被删除的原因是因为 ostringstream
您拥有的成员不可复制。
因此您提供了自定义复制构造函数并尝试以这种方式复制流:
this->mBuf << otherLogger.mBuf.rdbuf();
只有这样不会复制任何内容,因为您的 rdbuf
是空的,而是在
failbit
The failbit
The streambuf overload of basic_ostream::operator<< if the function inserts no characters. http://en.cppreference.com/w/cpp/io/ios_base/iostate
如果您要像这样检查您的消息插入:
if (!(mBuf << msg))
std::cout << "Not Inserted" << std::endl;
您会看到打印出 Not Inserted
消息。有很多方法可以让它打印出想要的信息。例如,确保您的 rdbuf
缓冲区不为空,或者在重用 mBuf
之前重置 failbit
,类似于 mBuf.clear();
或简单地通过 return参考 mInfoLogger
(和 mErrorLogger
)。然后你就可以安全地摆脱你的拷贝构造函数了。