gpt4 book ai didi

c++ - ostringstream 在插入输出后为空

转载 作者:行者123 更新时间:2023-11-28 04:39:33 25 4
gpt4 key购买 nike

我有一个奇怪的问题,即使我向它插入输出,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内容。

我认为当您尝试按值返回 mInfoLogger 时,编译器会提示无法返回它,因为复制构造函数已被删除。它被删除的原因是因为您拥有的 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 (); 或简单地通过返回对 mInfoLogger(和 mErrorLogger)的引用。然后你可以安全地摆脱你的复制构造函数。

关于c++ - ostringstream 在插入输出后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50541468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com