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