补充C++知识

基本功能用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(),没有参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值