基本功能用C++实现
详细解释戳这里->unordered_map
unordered_map 是一个无序的map
引擎中的用法如下
unordered_map<string, function<Module*()>> _mapMoudles = {
{ MODULENAME_ALGORITHM, [] {return &ModuleAlgorithm::Instance();} },
..........//省略一部分
}
unordered_map 的构造方法
std::unordered_map<std::string, std::string> umap;
map的用法大家应该都了解(不了解戳这里map,其他大佬的解释)
我觉得肯定不止我一个第一次看见return &ModuleAlgorithm::Instance();
这个用法。
return
这个大家都不陌生
return 0; 梦开始的地方
Instance可以理解为静态调用。(这里留个线程的坑,等我回来填)
单例模式
这个符号&
,取地址符,说到这个就要和指针放在一起,放在这里说不完,留个指针的坑慢慢填
简单讲一下我们在初学C/C++的时候应该都写过类似的代码
#include<stdio.h>
int main(){
int a,b;
scanf("%d",&a,&b);
int c;
c =a+b;
printf("%d",c);
return 0;
}
在这里可以做一个操作a = 2
在这里我们给a赋值为2,a为变量名,2是变量的值,&a是变量a的地址.
变量名传递过去的是当前变量的一个拷贝,在函数中对这些变量进行改变是不影响函数外这些变量的值的,为了得到结果并影响到这些变量,只有传递地址,或者对地址的引用。引用自这里
如果没理解这些也不重要,我们可以理解为例子里取了一个指针的值。
这里还有一个平常(指大学课上)写代码不太常用的东西 std::
详细戳这里
最简单的输出来说
//#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world!";//输出一句话
cout<<endl;//换行
return 0;
}
但是当我们去掉了using namespace std;
之后我们就要用到这个写法
#include<iostream>
int main()
{
std::cout<<"hello world!";//输出一句话
std::cout<<std::endl;//换行
return 0;
}
std:: 是个名称空间标示符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。
对象count是标准函数库所提供的对象,而标准库在名字空间中被指定为std,所以在使用cout的时候要加上std::。这样编译器就会明白我们调用的cout是名字空间std中的cout。
结构体相关戳这里
struct Data
{
int a,b,c;
}; /*定义结构体类型*/
struct Data* p; /* 定义结构体指针 */
struct Data A = {1,2,3}; / *声明结构体变量A,A即结构体名 * /
int x; /* 声明一个变量x */
p = &A; /* 地址赋值,让p指向A */
x = p->a; /* 取出p所指向的结构体中包含的数据项a赋值给x */
此时由于p指向A,因而 p->a == A.a,也就是1
~在C++中的用法
析构函数
这里有解释
智能指针
C++11
超好用的解释
C++有关文件读入的问题
大佬文章
引擎中用到的是 ifstream
ifstream: 读操作(输入)的文件类(由istream引申而来)
详细的戳这个详解
引擎中的用法
int _LoadConfig()//定义函数
{
ifstream fin("config.json");//读入文件
if (!fin.good())//函数good().用来判断当前流的状态(读写正常(即符合读取和写入的类型),没有文件末尾)
return CONFIGERROR_LOADING;
stringstream ssContent;
ssContent << fin.rdbuf();//把一个流对象用另一个流对象输出 <<表示位移
fin.close(); fin.clear();//stringstream 中可以直接用>>表示输出
cJSON* pJSONRoot = cJSON_Parse(ssContent.str().c_str());//其函数原型为:const char *c_str(); c_str()是一个指针(实际上是一个临时指针),指向一个字符串数组,里面装载一个字符串。需要注意的是此指针是一个由const修饰的常量指针,其值不可改变,只能读取
ssContent.clear();//内容与调用此方法的原字符串相同。即通过c_str()方法,补充C中没有string类型的问题,,通过STRING类对象的成员函数c_str()把string对象转换为c中字符串的样式。
if (!(pJSONRoot && pJSONRoot->type == cJSON_Object))
{
cJSON_Delete(pJSONRoot);
return CONFIGERROR_PARSING;
}
状态标志符的验证(Verification of state flags)
除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值):
bad() | 如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候. |
---|---|
fail() | 除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。 |
eof() | 如果读文件到达文件末尾,返回true。 |
good() | 这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。 |
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数