iterator模式应该是最为熟悉的模式了,最简单的证明就是在实现Composite模式,Flyweight模式,Observer模式中就直接用到了STL提供的Iterator来遍历Vector或者List数据结构。
Iterator模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。
iterator迭代器模式提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
小demoiterator.h
#ifndef ITERATOR_H #define ITERATOR_H typedef int DATA; class Iterater; // 容器的抽象基类 class Aggregate { public: virtual ~Aggregate(){} virtual Iterater* CreateIterater(Aggregate *pAggregate) = 0; virtual int GetSize() = 0; virtual DATA GetItem(int nIndex) = 0; }; // 迭代器的抽象基类 class Iterater { public: virtual ~Iterater(){} virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() = 0; virtual DATA CurrentItem() = 0; }; // 一个具体的容器类,这里是用数组表示 class ConcreateAggregate : public Aggregate { public: ConcreateAggregate(int nSize); virtual ~ConcreateAggregate(); virtual Iterater* CreateIterater(Aggregate *pAggregate); virtual int GetSize(); virtual DATA GetItem(int nIndex); private: int m_nSize; DATA *m_pData; }; // 访问ConcreateAggregate容器类的迭代器类 class ConcreateIterater : public Iterater { public: ConcreateIterater(Aggregate* pAggregate); virtual ~ConcreateIterater(){} virtual void First(); virtual void Next(); virtual bool IsDone(); virtual DATA CurrentItem(); private: Aggregate *m_pConcreateAggregate; int m_nIndex; }; #endif
iterator.cpp
#include <iostream> #include "Iterator.h" ConcreateAggregate::ConcreateAggregate(int nSize) : m_nSize(nSize), m_pData(NULL) { m_pData = new DATA[m_nSize]; for (int i = 0; i < nSize; ++i) { m_pData[i] = i; } } ConcreateAggregate::~ConcreateAggregate() { delete [] m_pData; m_pData = NULL; } Iterater* ConcreateAggregate::CreateIterater(Aggregate *pAggregate) { return new ConcreateIterater(this); } int ConcreateAggregate::GetSize() { return m_nSize; }
main.cpp
#include "Iterator.h" #include <iostream> int main() { Aggregate* pAggregate = new ConcreateAggregate(4); Iterater* pIterater = new ConcreateIterater(pAggregate); for (; false == pIterater->IsDone(); pIterater->Next()) { std::cout << pIterater->CurrentItem() << std::endl; } system("pause"); return 0; }
一.下载linux内核源码
我使用的是linux-loongson-release-zb-kernel.tgz
将其解压到/usr/src目录下: tar -xzvf linux-loongson-release-zb-kernel.tgz
这样在此目录下会生成linux-loongson-release目录
二.下载交叉编译工具
下载地址: http://dev.lemote.com/files/binary/toolchain/kernel/gcc-3.4.6-newbin.ls2f.tar.gz
解压放到/opt目录下,先要修改/opt的权限
sudo chmod 766 /opt
tar -xzf gcc‐3.4.6‐newbin.ls2f.tar.gz -C /opt
然后在环镜变量中制定其路径
export PATH=/opt/gcc-3.4.6-newbin/bin:$PATH 也可把它写入~/.bashrc,便于多次使用
设置可执行权限
chmod +x /opt/gcc-3.4.6-newbin/bin -R
三.内核配置
在源码目录下:
cp arch/mips/configs/loongson3a_xxxx_config
注:目前在arch/mips/configs下有5个龙芯3a的配置文件
loongson3a_dawning_config
loongson3a_rs780e_config
loongson3a_server_2u_defconfig
loongson3a_server_blade_defconfig
loongson3a_server_config
然后再make config 你会发现龙芯3a默认配置已经写到配置文件中去了.
四.编译内核
1.本地编译直接 make完成内核的编译
2.交叉编译情况下,进入内核源码根目录下,输入: make ARCH=mips CROSS_COMPILE=mipsel-linux-
也可修改makefile,对于反复编译此法一劳永逸.修改根目录下的makefile
给ARCH变量赋值: ARCH ?= mips
给CROSS_COMPILE 变量赋值CROSS_COOMPILE ?= mipsel‐linux‐
注:此步执行前要make menuconfig 进入配置界面把 Enable loadable module support 选中.再把它的下一级目录的3和4,或2和4选中.
并且修改完要选择 Save an Alternate Configuration File进行保存.
概述: 在启动Tomcat,提示8080端口(如果安装的时候端口被修改了,使用你自己设置的端口)被占用了。解决方法如下:
1. 开始-> 运行 -> 输入cmd
2. 输入 netstat -ano, 查看是哪个程序占用了8080的端口,记住该进程的PID
3. 打开任务管理器,
4. 查找对应第2步的PID的进程.( 如果任务管理器没有PID这一列,请打开 查看-> 选择列, 把PID这一项选上)
5. 关闭该进程,重启tomcat