在学习muduo_base库中的日志类时,发现了一种新鲜的语法。
1.在类的public中typedef定义的新类型,可以在类外使用类名::新类型名
的方式调用。
class Test
{
public:
typedef int integer;
...
};
如果该语句放在public段中,则可以在类外部使用,如:
Test::integer a=1;//声明一个变量
2.在类的public中声明了枚举类,那么可以通过类名::enum值
直接访问枚举值,不需要通过对象。
测试代码如下(自己写的挺好的例子^^):
#include<iostream>
using namespace std;
//目的:验证了在类的public中typedef定义的新类型,可以在类外使用 类名::新类型名 的方式调用
class Logger {
public:
//枚举类型LogLevel
enum LogLevel
{
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL,
NUM_LOG_LEVELS,
};
typedef void(*OutputFunc)(const char* msg, int len);
typedef void(*FlushFunc)();
static void setOutput(OutputFunc);
static void setFlush(FlushFunc);
typedef int integer;
};
void defaultOutput(const char* msg, int len)
{
cout << "defaultOutput" << endl;
}
void MyOutput(const char* msg, int len)
{
cout << string(msg) << "," << len << endl;
}
void defaultFlush()
{
cout << "defaultFlush" << endl;
}
void MyFlush()
{
cout << "MyFlush" << endl;
}
Logger::OutputFunc g_output = defaultOutput;//创建函数指针g_output(全局变量)
Logger::FlushFunc g_flush = defaultFlush;//创建函数指针g_flush(全局变量)
void Logger::setOutput(OutputFunc out)
{
g_output = out;
}
void Logger::setFlush(FlushFunc flush)
{
g_flush = flush;
}
Logger::LogLevel g_logLevel = Logger::INFO;//定义全局变量g_logLevel并初始化
//可以通过 类名::enum值 直接访问枚举值,不需要通过对象
int main() {
cout << g_logLevel << endl;
Logger::integer a = 1;
cout << a << endl;
const char*str = "shenhang";
g_output(str, strlen(str));
g_flush();
cout << "----------------------------------" << endl;
Logger::setOutput(MyOutput);
Logger::setFlush(MyFlush);
g_output(str, strlen(str));
g_flush();
system("pause");
return 0;
}