C++ 11 智能指针 lamda 以及一个 围棋程序
lamda表达式使用
1 char* p = "Hello world"; 2 int ne = 0,nl = 0; 3 for_each(p,p+11, [&](char i){ if(i=='e') ne++; if(i=='l')nl++; }); 4 cout<<"e: "<< ne <<endl<<"l: "<<nl<<endl;
for_each 第三个参数 原来应该是函数
此处用lamda表达式完成
智能指针使用
我不知道循环右移如何使用智能指针
就在一个函数里面完成了循环右移
因为智能指针有以下功能
当智能指针本身被删除释放的时候(比如,离开了某个作用域),会使用给定的删除器释放它指向的对象
所以我在函数内使用了智能指针,希望函数结束,申请的空间自动释放
1 void move(int x){ 2 auto s = unique_ptr <string>(new string("Hello world!")); 3 auto ss = s.get(); 4 auto i = (*ss).end(); 5 for_each (i-x%(*ss).length(),i,[&](char a){cout<<a;}); 6 for_each ((*ss).begin(),i-x%(*ss).length(),[&](char a){cout<<a;}); 7 }
以上两个作业我写在了一个文件中
1 #include<iostream> 2 #include <algorithm> 3 #include<string> 4 #include<memory> 5 using namespace std; 6 7 void move(int x){ 8 auto s = unique_ptr <string>(new string("Hello world!")); 9 auto ss = s.get(); 10 auto i = (*ss).end(); 11 for_each (i-x%(*ss).length(),i,[&](char a){cout<<a;}); 12 for_each ((*ss).begin(),i-x%(*ss).length(),[&](char a){cout<<a;}); 13 } 14 15 16 int main(){ 17 char* p = "Hello world"; 18 int ne = 0,nl = 0; 19 for_each(p,p+11, [&](char i){ if(i=='e') ne++; if(i=='l')nl++; }); 20 cout<<"e: "<< ne <<endl<<"l: "<<nl<<endl; 21 22 int x; 23 cin>>x; 24 move(x); 25 return 0; 26 }
运行截图
围棋
1.写代码
看了大半夜 终于看懂这代码了
恢复棋步就是需要一下几个步骤
先把下的那个子去除 removeStone();
再把DeadGroup中的死棋拿出来恢复
再更新一下m_gmLastMove
public void playPrev(GoMove gm) { Point a = gm.Point; //先移除该棋子 Grid[a.X,a.Y].removeStone(); //判断是否有死棋 且不是自己作死的棋 if (gm.DeadGroup != null && gm.DeadGroupColor != gm.Color) { foreach (Point p in gm.DeadGroup) { Grid[p.X,p.Y].setNoKilled(); Grid[p.X, p.Y].setStone(gm.DeadGroupColor); } } m_gmLastMove = gameTree.peekPrev(); if (m_gmLastMove != null) Grid[m_gmLastMove.Point.X, m_gmLastMove.Point.Y].setUpdated(); optRepaint(); return; }
2.根据你选择的教材 (三本之一或更多),点评一下这个程序设计方面的不足
感觉这个程序写的很随意 一些类和方法都是什么构造出来但却不使用
不足有以下几点
1.有些函数作用不够清晰,或者说封装不合适
2.有些变量命名难以让人理解 如int m_n 乍一看还以为是一个不是很重要的变量 实际却是棋步数 而其他地方的棋步数却是seq 应该用m_seq比较合适
3.整个代码结构感觉混乱
4.错不处理不行
但是如果这是一个java大作业的话 我觉得已经可以接受了。
代码分析工具
这些警告太多了。。。就不一个一个更改了
我查看了一下主要分为几类
1.标示符大小写问题
2.标示符命名要有意义 别老是就m,n,i,j,k
3.丢失范围之前释放对象
4.尽量使用私有化成员
3.代码注释
已经上传github