如何使运算符重载在友元函数中正常工作?
How to make operator overloading work properly inside friend function?
我获取了一个免费的版权模板代码并根据自己的需要进行了修改,但仍在努力使其发挥作用。如果能帮助我理解,我将不胜感激。
问题是我真的不明白重载是如何工作的,尤其是 >> 运算符,如下例所示。为什么你在 friend &operator 函数中 return object logger
。我不明白如何让 void print();
工作并与超载的朋友互动 operator <<
。
这是示例代码:
#pragma once
#include <fstream>
namespace Log{
class LogFile {
public:
enum class logType { LOG_ALWAYS=0, LOG_OKAY, LOG_ERROR, LOG_WARNING, LOG_INFO};
enum class writeType {FOUT=0, CFOUT, FCOUT, COUT};
explicit LogFile(string fname = "[nameError]log.txt") : numWarnings(0U), numErrors(0U)
{
myFile.open(fname);
if (myFile.is_open())
std::cout << "Log file was created successfully!" << std::endl << std::endl;
else
{
std::cout << "Fatal Error can't create log file!" << std::endl << "Please check Application permissions" << std::endl;
exit(1);
}
}
~LogFile()
{
if (myFile.is_open())
{
myFile << std::endl << std::endl;
myFile << numWarnings << " warnings" << std::endl;
myFile << numErrors << " errors" << std::endl;
myFile.close();
}
}
friend LogFile &operator << (LogFile &logger, const logType e_logtype)
{
//TO DO
//logger.myFile << tm << "| " << memUsed << "kb added|";
//<< "000000.000 | 0.0000kb added |"
switch (e_logtype)
{
case LogFile::logType::LOG_ALWAYS:
logger.myFile << " ALWAYS| ";
break;
case LogFile::logType::LOG_OKAY:
logger.myFile << " OKAY| ";
break;
case LogFile::logType::LOG_ERROR:
logger.myFile << " ERROR| ";
++logger.numErrors;
break;
case LogFile::logType::LOG_WARNING:
logger.myFile << " WARN| ";
++logger.numWarnings;
break;
default:
logger.myFile << " INFO| ";
break;
}
return logger;
}
friend LogFile &operator << (LogFile &logger, const char* text)
{
logger.myFile << tex t << std::endl;
return logger;
}
LogFile(const LogFile &) = delete;
LogFile &operator= (const LogFile &) = delete;
//THIS IS MY PART
friend void print(LogFile &logger, const char* text, const logType e_logtype, const writeType e_writetype)
{
switch (e_writetype)
{
case LogFile::writeType::FOUT:
logger << LogFile::logType::e_logtype << text;
break;
case LogFile::writeType::FCOUT:
case LogFile::writeType::CFOUT:
std::cout << text << std::endl;
logger << LogFile::logType::e_logtype << text;
break;
case LogFile::writeType::COUT:
default:
std::cout << text << std::endl;
break;
}
return;
}
private:
std::ofstream myFile;
unsigned int numWarnings;
unsigned int numErrors;
};
}
想法是将其用作 header 并在 main.cpp 中使用以下方法记录所有内容:
using namespace Log;
LogFile mylog;
mylog.print("Test...", LOG_OKAY, FCOUT);
其中:
LOG_OKAY, LOG_ERROR, etc - types of log info.
COUT, FCOUT, CFOUT, FOUT - log to file or cout or both
已编辑:我在 3 周前解决了这个问题。感谢@zenith 的回答。如果再次打开问题,我会 post 解决方案,其中包含我已更改的概述代码并指向它们。谢谢:)
I don't really understand why you return the object logger
in the friend &operator function.
这样您就可以像这样链接多个调用:
logger << logtype << text << moretext;
And how to make void print
work and interact with friend overloaded operators <<
.
您可以通过删除 e_logtype
前面的 LogFile::logType::
来修复编译错误:
logger << e_logtype << text;
因为e_logtype
不是LogFile::logType
的成员,它是LogFile::logType
.
类型的对象
您还缺少 #include <string>
using std::string
和 #include <iostream>
.
我获取了一个免费的版权模板代码并根据自己的需要进行了修改,但仍在努力使其发挥作用。如果能帮助我理解,我将不胜感激。
问题是我真的不明白重载是如何工作的,尤其是 >> 运算符,如下例所示。为什么你在 friend &operator 函数中 return object logger
。我不明白如何让 void print();
工作并与超载的朋友互动 operator <<
。
这是示例代码:
#pragma once
#include <fstream>
namespace Log{
class LogFile {
public:
enum class logType { LOG_ALWAYS=0, LOG_OKAY, LOG_ERROR, LOG_WARNING, LOG_INFO};
enum class writeType {FOUT=0, CFOUT, FCOUT, COUT};
explicit LogFile(string fname = "[nameError]log.txt") : numWarnings(0U), numErrors(0U)
{
myFile.open(fname);
if (myFile.is_open())
std::cout << "Log file was created successfully!" << std::endl << std::endl;
else
{
std::cout << "Fatal Error can't create log file!" << std::endl << "Please check Application permissions" << std::endl;
exit(1);
}
}
~LogFile()
{
if (myFile.is_open())
{
myFile << std::endl << std::endl;
myFile << numWarnings << " warnings" << std::endl;
myFile << numErrors << " errors" << std::endl;
myFile.close();
}
}
friend LogFile &operator << (LogFile &logger, const logType e_logtype)
{
//TO DO
//logger.myFile << tm << "| " << memUsed << "kb added|";
//<< "000000.000 | 0.0000kb added |"
switch (e_logtype)
{
case LogFile::logType::LOG_ALWAYS:
logger.myFile << " ALWAYS| ";
break;
case LogFile::logType::LOG_OKAY:
logger.myFile << " OKAY| ";
break;
case LogFile::logType::LOG_ERROR:
logger.myFile << " ERROR| ";
++logger.numErrors;
break;
case LogFile::logType::LOG_WARNING:
logger.myFile << " WARN| ";
++logger.numWarnings;
break;
default:
logger.myFile << " INFO| ";
break;
}
return logger;
}
friend LogFile &operator << (LogFile &logger, const char* text)
{
logger.myFile << tex t << std::endl;
return logger;
}
LogFile(const LogFile &) = delete;
LogFile &operator= (const LogFile &) = delete;
//THIS IS MY PART
friend void print(LogFile &logger, const char* text, const logType e_logtype, const writeType e_writetype)
{
switch (e_writetype)
{
case LogFile::writeType::FOUT:
logger << LogFile::logType::e_logtype << text;
break;
case LogFile::writeType::FCOUT:
case LogFile::writeType::CFOUT:
std::cout << text << std::endl;
logger << LogFile::logType::e_logtype << text;
break;
case LogFile::writeType::COUT:
default:
std::cout << text << std::endl;
break;
}
return;
}
private:
std::ofstream myFile;
unsigned int numWarnings;
unsigned int numErrors;
};
}
想法是将其用作 header 并在 main.cpp 中使用以下方法记录所有内容:
using namespace Log;
LogFile mylog;
mylog.print("Test...", LOG_OKAY, FCOUT);
其中:
LOG_OKAY, LOG_ERROR, etc - types of log info.
COUT, FCOUT, CFOUT, FOUT - log to file or cout or both
已编辑:我在 3 周前解决了这个问题。感谢@zenith 的回答。如果再次打开问题,我会 post 解决方案,其中包含我已更改的概述代码并指向它们。谢谢:)
I don't really understand why you return the object
logger
in the friend &operator function.
这样您就可以像这样链接多个调用:
logger << logtype << text << moretext;
And how to make
void print
work and interact with friend overloadedoperators <<
.
您可以通过删除 e_logtype
前面的 LogFile::logType::
来修复编译错误:
logger << e_logtype << text;
因为e_logtype
不是LogFile::logType
的成员,它是LogFile::logType
.
您还缺少 #include <string>
using std::string
和 #include <iostream>
.