gpt4 book ai didi

c++ - 从没有虚函数的 C++ 类继承

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:38 24 4
gpt4 key购买 nike

我们有一个基于带有自定义流缓冲区的 std::ostream 的日志实现。我们通过 Schwarz 计数器实现应用程序的日志类实例。

为了避免将较低级别的类耦合到我们的日志实现,我们可以传递对 std::ostream 的引用。通过这种方式,我们的低级别类可以记录到 std::cout、std::cerr 或通过 Schwarz 计数器创建的实例。

我有一个问题。日志实现通过流运算符的重载设置其严重性:

// Overload the << operator to set the log message severity
inline CLogStream& operator << (CLogStream& myLogStream, eMsgType::type msgTypeCurrent)
{
myLogStream.SetMsgTypeCurrent(msgTypeCurrent);
return ( myLogStream ) ;
}

这允许我们像这样使用记录器:

CLog::Main << CLog::MSG_FATAL << "Fatal error" << std::endl;

我想创建对我们的应用程序日志实例的引用,该实例被锁定为特定严重性。这样,我可以将两个 std::ostream 引用传递给我们的实用程序类。其中一个将用于正常报告,另一个用于错误报告。这些可以设置为 std::cout 和 std::cerr,或者设置为引用我们的日志对象实例的某种对象。

不幸的是,据我所知,std::ostream 运算符 << 不是虚拟的,所以我不确定如何设计这样的对象。

有什么想法吗?

最佳答案

iostream有虚拟成员函数(特别是 ~ios_base )所以你可以执行 dynamic_castoperator<< :

inline std::ostream &operator<<(std::ostream &os, eMsgType::type msgTypeCurrent) {
if (CLogStream *myLogStream = dynamic_cast<CLogStream *>(&os)) {
myLogStream->SetMsgTypeCurrent(msgTypeCurrent);
} else {
os << "TYPE: " << static_cast<typename std::underlying_type<eMsgType::type>
::type>(msgTypeCurrent) << ": ";
}
return os;
}

关于c++ - 从没有虚函数的 C++ 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14830450/

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