ostringstream пуст после вставки в него вывода - PullRequest
0 голосов
/ 26 мая 2018

У меня странная проблема, когда 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: 

1 Ответ

0 голосов
/ 26 мая 2018

Хотя @BoPersson уже дал вам решение, я хотел бы объяснить, что здесь произошло, и почему ваш вывод пустой, даже если вы добавляете к ostringstream в строке непосредственно перед отображением ее содержимого.

Я думаю, что когда вы пытались вернуть mInfoLogger по значению, компилятор жаловался на невозможность вернуть его, поскольку конструктор копирования был удален.Причина, по которой он был удален, потому что ostringstream член, который у вас есть, не подлежит копированию.

Итак, вы предоставили пользовательский конструктор копирования и попытались скопировать поток следующим образом:

this->mBuf << otherLogger.mBuf.rdbuf();

Только это делаетне копируйте ничего, так как ваш rdbuf пуст и вместо этого устанавливает failbit в

бит перехода

Перегрузка потока потока при использовании basic_ostream :: operator <<если функция не вставляет никаких символов.<a href="http://en.cppreference.com/w/cpp/io/ios_base/iostate" rel="nofollow noreferrer">http://en.cppreference.com/w/cpp/io/ios_base/iostate

Если бы вы проверяли вставку вашего сообщения следующим образом:

if (!(mBuf << msg))
    std::cout << "Not Inserted" << std::endl;

Вы бы увидели Not Inserted сообщение напечатанным.Есть много способов заставить его напечатать нужное сообщение.Например, убедитесь, что ваш буфер rdbuf не пуст, или сбросьте failbit перед повторным использованием mBuf, что-то вроде mBuf.clear();, или просто верните ссылку на mInfoLoggermErrorLogger).Тогда вы можете безопасно избавиться от вашего конструктора копирования.

...