??xml version="1.0" encoding="utf-8" standalone="yes"?> 原文Q?nbsp;JavaScript, We Hardly new Ya Q-Douglas Crockford?/font> JavaScript是一门基于原型的语言Q但它却拥有一?new 操作W得其看v来象一门经典的面对对象语言。那样也qh了程序员们,D一些有问题的编E模式?/font> 其实你永q不需要在JavaScript使用 new Object()。用字面量的形式{}d代吧?br /> 同理不用使用 new Number, new String, 或?new Boolean。这些的用法只会产生无用的类型封装对象。就直接使用单的字面量吧?/font> 不要使用 new Function d建函数对象。用函数表达式更好。比如: frames[0].onfocus = new Function(“document.bgColor=’antiquewhite’”) 更好的写法是Q?/font> frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;}; W二UŞ式让脚本~译器更快的看到函数MQ于是其中的语法错误也会更快被检出来。有时候程序员使用 new Function 是因Z们没有理解内部函数是如何工作的?/font> selObj.onchange = new Function(“dynamicOptionListObjects["+ 如果我们让用字符串做函数体,~译器不能看到它们。如果我们用字符串表辑ּ做函CQ我们同样也看不到它们。更好的方式是不要盲目~程。通过刉一个返回gؓ函数的函数调用,我们可以明确的按g递我们想要绑定的倹{这允许我们在@环中初始化一pd selObj 对象?/font> selObj.onchange = function (i) { }; 直接对一个函C用new永远不是一个好L。比如, new function Ҏ造新对象没有提供什么优ѝ?/font> myObj = new function () { 更好的方式是使用对象字面量,它更dyQ更快捷?/font> myObj = { 假如我们需要创建的对象包含的方法需要访问私有变量或者函敎ͼ更好的方式仍然是避免使用new.var foo = new function() { <span> 标签被用来组合文档中的行内元素?/p> NONE 提示Q?/span>请?<span> 来组合行内元素,以便通过样式来格式化它们?/p> 注释Q?/span>span 没有固定的格式表现。当对它应用样式Ӟ它才会生视觉上的变化?/p> 如果不对 span 应用样式Q那?span 元素中的文本与其他文本不会Q何视觉上的差异。尽如此,上例中的 span 元素仍然?p 元素增加了额外的l构?/p> 可以?span 应用 id ?class 属性,q样既可以增加适当的语义,又便于对 span 应用样式?/p> 可以对同一?<span> 元素应用 class ?id 属性,但是更常见的情况是只应用其中一U。这两者的主要差异是,class 用于元素l(cM的元素,或者可以理解ؓ某一cd素)Q?id 用于标识单独的唯一的元素?/p> 提示Q?/span>事实上,您也许已l注意到了,W3School 站点上有一些文本的样式与其他文本是不同的。比?#8220;提示”使用了粗体的红艌Ӏ尽实现这U效果的Ҏ非常多,但是我们的做法是Q?#8220;提示”使用 span 元素Q然后对q个 span 元素的父元素Q即 p 元素应用 classQ这样就可以对这个类的子元素 span 应用相应的样式了?/p> HTML: CSS: 如需完整的描qͼ误?a style="text-decoration: underline; color: #900b09; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">标准属?/a>?/p> 如需完整的描qͼ误?a style="text-decoration: underline; color: #900b09; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; ">事g属?/a>?/p> 在C中,實際上是使用Stream I/O的方式來存取資料。也是說,當打開一個檔案後Q?OS那邊會將一部分的資料先讀起來在一個暫存的Buffer裡,然後FILE這個pointer會L向這個bufferQ?每讀取一個字元時Q它會往前移動一個。同樣的Q當我們在寫入的時候,當我們完成像是fprintf時, 它也是先寫入這個buffer中,直到這個buffer被flush或是寫出到device中,才會真正的做改變?/p> 這張圖的左邊是deviceQ右邊就是buffer?br>
--JavaScript ?newQ?好久不见?/h2>
同理Q不要?new Array() Q而代之以字面量[]。JavaScript中的数组q不象Java中的数组那样工作的,使用cMJava的语法只会让你糊涂?/font>
dol.index+"].change(this)”);
return function () {
dynamicOptionListObjects[i].change(this);
}(dol.index);
this.type = ‘core’;
};
type: ‘core’
};
function processMessages(message) {
alert(“Message: ” + message.content);
}
this.init = function() {
subscribe(“/mytopic”, this, processMessages);
}
}
通过使用 new 去调用函敎ͼ对象会持有一个无意义的原型对象。这只会费内存而不会带来Q何好处。如果我们不使用newQ我们就不用在对象链l护一个无用的prototype对象。所以我们可以用Q)来正的调用工厂函数?/font>var foo = function () {
function processMessages(message) {
alert(“Message: ” + message.content);
}
return {
init: function () {
subscribe(“/mytopic”, this, processMessages);
}
};
}();
所以原则很单: 唯一应该要用到new操作W的地方是调用一个古老的构造器函数的时候。当调用一个构造器函数的时候,是强制要求用new的?/font>有时候可以来new一? 有的时候还是不要了吧?/font>
]]>
]]>
--HTML <span> 标签
定义和用?/h2>
HTML ?XHTML 之间的差?/h2>
提示和注释:
例子
<p>
<span>some text.</span>
some other text.</p>例子解释
<p class="tip"><span>提示Q?lt;/span>... ... ...</p>
p.tip span {
font-weight:bold;
color:#ff9955;
}
标准属?/h2>
id, class, title, style, dir, lang, xml:lang
事g属?/h2>
onclick, ondblclick, onmousedown, onmouseup, onmouseover,
onmousemove, onmouseout, onkeypress, onkeydown, onkeyup
]]>
var add = function (a,b){
return a + b;
}
///////////// Invocation
// The Method Invocation Pattern
var myObject = {
value: 0,
increment: function (inc) {
this.value += typeof inc === 'number' ? inc : 1;
}
};
myObject.increment();
document.writeln(myObject.value);
myObject.increment(2);
document.writeln(myObject.value);
// The Function Invocation Pattern
var sum = add(3, 4);
myObject.double = function(){
var that = this; // Workaround
var helper = function(){
that.value = add(that.value, that.value)
};
helper();
};
// Invoke double as a method.
myObject.double();
document.writeln(myObject.value);
// The Constructor Invocation Pattern
var Quo = function(string){
this.status = string;
};
Quo.prototype.get_status = function(){
return this.status;
};
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());
// The Apply Invocation Pattern
var array = [3, 4];
var sum = add.apply(null, array);
var statusObject = {
status: 'A-OK'
};
var status = Quo.prototype.get_status.apply(statusObject);
//////////////// Arguments
var sum = function(){
var i, sum = 0;
for(i = 0; i < arguments.length; i += 1){
sum += arguments[i];
}
return sum;
};
document.writeln(sum(4, 8, 15, 16, 23, 42));
////////////////// 4.6 Exceptions
var add = function(a, b){
if(typeof a !== 'number' || typeof b !== 'number'){
throw{
name: 'TypeError',
message: 'add needs numbers'
}
}
return a + b;
}
var try_it = function(){
try{
add("seven");
}catch(e){
document.writeln(e.name + ': ' + e.message);
}
}
try_it();
/////////////// 4.7 Argumenting Types
// TODO
Function.prototype.method = function(name, func){
this.prototype[name] = func;
return this;
};
Number.method('integer', function(){
return Math[this < 0 ? 'ceil' : 'floor'](this);
});
document.writeln((-10 / 3).integer());
String.method('trim', function(){
return this.replace(/^\s+|\s+$/g, '');
});
document.writeln('"' + " neat ".trim() + '"');
Function.prototype.method = function(name, func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
};
/////////////////// 4.8 Recursion
// hanoi问题Q递归求解
var hanoi = function(disc, src, aux, dst){
if(disc > 0){
hanoi(disc - 1, src, dst, aux);
document.writeln('Move disc ' + disc + ' from ' + src + ' to ' + dst);
hanoi(disc - 1, aux, src, dst);
}
}
hanoi(3, 'Src', 'Aux', 'Dst');
// 递归处理览器端的文档对象模?/span>
// TODO wark_the_DOM ?nbsp;walk 什么关p?
var wark_the_DOM = function walk(node, func){
func(node);
node = node.firstChild;
while(node){
walk(node, func);
node = node.nextSibling;
}
};
var getElementsByAttribute = function(att, value){
var results = [];
wark_the_DOM(document.body, function(node){
var actual = node.nodeType === 1 && node.getAttribute(att);
if(typeof actual === 'string' && // node属性是string,node值等于传入的valueQ或者value不是string
(actual === value || typeof value !== 'string')){
results.push(node);
}
});
};
// N归求阶乘。js不能做尾递归优化?/span>
var factorial = function factorial(i, a){
a = a || 1;
if(i < 2){
return a;
}
return factorial(i - 1, a * i);
};
document.writeln(factorial(4));
//////////////// Scope
var foo = function(){
var a = 3, b = 5;
var bar = function(){
var b = 7, c = 11;
a += b + c;
};
bar();
};
foo();
////////////// Closure
// 通过调用函数的Ş式初始化myObject
// 该函数返回一个包含有2个方法的对象Qƈ且这些方法n有l访问value变量的特?/span>
var myObject = function(){
var value = 0;
return {
increment: function(inc){
value += typeof inc === 'number' ? inc : 1;
},
getVaule: function(){
return value;
}
}
}(); // 立刻执行
// 创徏一个名为quo的构造函? 它构造出带有get_statusҎ和statusU有属性的一个对象?/span>
var quo = function(status){
return {
get_status: function(){
return status;
}
};
};
var myQuo = quo("amazed");
document.writeln(myQuo.get_status());
// 定义一个函敎ͼ它设|一个DOM节点为黄Ԍ然后把它变成白色
var fade = function(node){
var level = 1;
var step = function(){
var hex = level.toString(16);
node.style.backgroundColor = '#FFFF' + hex + hex; // TODO 颜色~码
if(level < 15){
level += 1;
setTimeout(step, 100); // setTimeout()Ҏ用于在指定的毫秒数后调用函数或计表辑ּ
}
};
setTimeout(step, 100);
};
fade(document.body);
// l一个数l中的节点设|事件处理程?/span>
var add_the_handles = function(nodes){
var i;
for(i = 0; i < nodes.length; i+=1){
node[i].onclick = function(i){
return function(e){
alert(e);
};
}(i);
}
};
add_the_handles(document.body);
///////////// Module
// L字符串中的HTML字符Qƈ替换为它们对应的字符
String.method('deentityify',function(){
// The entity table. Itmaps entity names to characters.
var entity= {
quot: '"',
lt: '<',
gt: '>'
};
// Return the deentityify method.
return function(){
return this.replace(/&([^&;]+);/g, // TODO 正则
function(a, b){
var r = entity[b];
return typeof r === 'string' ? r : a;
})
};
}());
document.writeln('<">'.deentityify());
// q回一个用来生唯一字符串的对象
// 唯一字符串由两部分组成:前缀+序列?br />// 该对象包括一个设|前~的方法,一个设|序列号的方法,和一个生唯一字符串的gensymҎ
var serial_maker = function(){
var prefix = '';
var seq = 0;
return {
set_prefix: function(p){
prefix = String(p);
},
set_seq: function(s){
seq = s;
},
gensym: function(){
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym();
document.writeln(unique);
/////////////// Curry
Function.method('curry', function(){
var slice = Array.prototype.slice;
args = slice.apply(arguments);
that = this;
return function(){
return that.apply(null, args.concat(slice.apply(arguments)));
};
});
var add1 = add.curry(1);
document.writeln(add1(6));
////////////// Memoization
// Fibonacci, beform memoization
var fibonacci = function(n){
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
};
for(var i = 0; i <= 10; i += 1){
document.writeln('//' + i + ': ' + fibonacci(i));
}
// after memoization
var fibonacci2 = function(){
var memo = [0, 1];
var fib = function(n){
var result = memo[n];
if(typeof result !== 'number'){
result = fib(n - 1) + fib(n - 2);
memo[n] = result;
}
return result;
};
return fib;
}();
for(var i = 0; i <= 10; i += 1){
document.writeln('//' + i + ': ' + fibonacci2(i));
}
var memoizer = function(memo, fundamental){
var shell = function(n){
var result = memo[n];
if(typeof result !== 'number'){
result = fundamental(shell, n);
memo[n] = result;
}
return result;
};
return shell;
};
var fabonacci3 = memoizer([0,1], function(shell, n){
return shell(n - 1) + shell(n - 2);
});
var factorial2 = memoizer([1,1], function(shell, n){
return n * shell(n - 1);
});
ch05 l承
5.1 伪类
吐下槽?the Function constructor that produces the function object runs some code like this:"被译成了“Function构造器产生的函数对象会q行cMq样的一些代码:”。主语都错了。这本书里的错误实比较多?br />
]]>
解决:
if not counters: return result_list
ps,好久没来,CuteEditor都支持chrome了啊:-)
]]>
int main(int argc, char **argv)
{
FILE *fin, *fout;
int i;
int c;
if((fout = fopen("tmp","w")) == NULL){
printf("create output file error.\n");
return 1;
}
for(i = 1; i < argc; i++){
fputs(argv[i], fout);
fputs("\n", fout);
}
for(i = 1; i < argc; i++){
if((fin = fopen(argv[i],"r")) == NULL){
printf("file not exist - %s\n", argv[i]);
return 1;
}
fputs("\n\n#############\n", fout);
fputs(argv[i], fout);
fputs("\n#############\n", fout);
while((c = fgetc(fin)) != EOF )
fputc(c, fout);
fclose(fin);
}
fclose(fout);
return 0;
}
]]>File I/O
The FILE type
Example: FILE *myfile;
Associate the variable with a file
"r" open for reading; 假如檔案不存在,則失敗?/td> "w" open or create for writing; 假如檔案存在Q其珑֭的內Ҏ被覆蓋?/td> "a" open or create for writng; 看w的不同在|它會接著珑֭的內容繼U做下去 "r+" open for reading and writing; 檔案一定要存在 "w+" open or create for reading and writing; 檔案不存在就開新檔案Q存在就覆寫 "a+" open or create for reading and writing; 不同處同上面a和w的差?/td> FILE *fopen(char *name, char *mode) Example: FILE *myfile;
myfile = fopen("input.txt", "r");
Testing for EOF
Syntax: int feof( FILE *stream );
Example:
if( feof( myfile ) )Writing / Reading by single character
Syntax: int fgetc( FILE *stream );
int fputc( int c, FILE *stream );
Example: FILE *myfile, *myfile2;
int c;
myfile = fopen("in", "r");>
myfile2 = fopen("out", "w");
while( (c=fgetc(myfile)) != EOF)
fputc(c, myfile2);
Writing / Reading by line of text
Syntax: char *fgets(char *str, int size, FILE *stream);
int fputs(const char *str, FILE *stream);
Example: FILE *myfile, *myfile2;
char tmp[80];
myfile = fopen("in", "r");>
myfile2 = fopen("out", "w");
while( (fgets(tmp, 80, myfile)) != NULL)
fputs(tmp, myfile2);
fprintf() and fscanf()
Examples: fprintf(outputfile, "My age is %d\n", myAge);
fscanf(inputfile, "%f", &floatVariable);
Close the files
Syntax: int fclose( FILE *stream );
A sample program
假如你們還是不會用的話 Q可以套?參?下面的程式?table class="ebox1" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: black; background-position: initial initial; background-repeat: initial initial; ">#include
]]>
A:
http://hi.baidu.com/%D4%BC%D0%DE%D1%C7ing/blog/item/d5f86a0f598b47c27acbe138.html
static void cut_mode(void)
如果写成static void cut_mode()
׃有警告function declaration isn't a prototype
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
--ex
23 struct option longopts[] = {
24 {"icmp", no_argument, NULL, 'i'},
25 {"help", no_argument, NULL, 'h'},
26 {"drop", required_argument, NULL, 'd'},
27 {0,0,0,0}
28 };
51 while((c = getopt_long(argc, argv, "hid:", longopts, NULL))!=-1){
52 switch(c){
53 case 'i':{
54 own->icmp_off = 1;
55 break;
56 }
57 case 'd':{
58 own->drop_ip = inet_addr(optarg);
59 break;
60 }
61 case 'h':{
62 print_help(argv[0]);
63 return -1;
64 }
65 default:
66 break;
67 }
--
作用Q?br>解析输入的参数?/p>
参数Q?br>argc和argv是传入main的参C??参数列表?br>"hid:"?h -i -d q样的选项Qd后有冒号Q表C?d选项有参数跟着?br>longopts是struct option *Q列?h -i -d对应的长选项格式--help --icmp --drop
相关外部变量Q?br>extern char *optarg; - 当前选项的参数字?/p>
pass语句什么也不做Q一般作为占位符或者创建占位程序,pass语句不会执行M操作Q比如:
while False:
pass
pass通常用来创徏一个最单的c:
class MyEmptyClass:
pass
pass在Y件设计阶D也l常用来作ؓTODOQ提醒实现相应的实现Q比如:
def initlog(*args):
pass #please implement this
使用print输出各型?/p>
strHello = 'Hello Python' print strHello #输出l果QHello Python #直接出字W串
python print也支持参数格式化Q与Ca的printf|
strHello = "the length of (%s) is %d" %('Hello World',len('Hello World')) print strHello #输出果:the length of (Hello World) is 11
nHex = 0x20 #%x --- hex 十六q制 #%d --- dec 十进?/span> #%d --- oct 八进?/span> print "nHex = %x,nDec = %d,nOct = %o" %(nHex,nHex,nHex) #输出l果QnHex = 20,nDec = 32,nOct = 40 #使用整数的各个制打印同一个数
import math #default print "PI = %f" % math.pi #width = 10,precise = 3,align = left print "PI = %10.3f" % math.pi #width = 10,precise = 3,align = rigth print "PI = %-10.3f" % math.pi #前面填充字符 print "PI = %06d" % int(math.pi) #输出l果 #PI = 3.141593 #PI = 3.142 #PI = 3.142 #PI = 000003 #点数的格式化,_ֺ、度?/span>
#precise = 3 print "%.3s " % ("jcodeer") #precise = 4 print "%.*s" % (4,"jcodeer") #width = 10,precise = 3 print "%10.3s" % ("jcodeer") #输出l果Q?/span> #jco #jcod # jco #同于字符串也存在_ֺ、度和?/span>
l = [1,2,3,4,'jcodeer'] print l #输出l果Q[1, 2, 3, 4, 'jcodeer'] #于list直接打印卛_ '''6.出字?dictionary)''' d = {1:'A',2:'B',3:'C',4:'D'} print d #输出l果Q{1: 'A', 2: 'B', 3: 'C', 4: 'D'} #同python也是支持dictionary出的
print 会自动在行末加上回R,如果不需回RQ只需在print语句的结添加一个逗号”,“Q就可以改变它的行ؓ?/p>
for i in range(0,5): print i,
或直接用下面的函数q行输出Q?/p>
sys.stdout.write("输出的字?)
功能P00H
功能Q设|显C模?br>
入口参数QAH=00H
AL=昄模式
昄模式列表:
昄模式 昄模式属?br>
00H 40×25 16?文本
01H 40×25 16?文本
02H 80×25 16?文本
04H 320×200 4?br>
05H 320×200 4?br>
06H 640×200 2?br>
07H 80×25 2?文本
08H 160×200 16?br>
09H 320×200 16?br>
0AH 640×200 4?br>
0BH 保留
0CH 保留
0DH 320×200 16?br>
0EH 640×200 16?br>
0FH 640×350 2Ԍ单色Q?br>
10H 640×350 4?br>
11H 640×480 2?br>
12H 640×480 16?br>
13H 320×200 256?br>
功能?1H
功能Q设|光标Ş?br>
入口参数Q?AHQ?1H
CH低四位=光标的v始行
CL低四位=光标的终止行
出口参数Q??br>
功能P02H
功能Q用文本坐标下设|光标位|?br>
入口参数Q?AHQ?2H
BHQ显C页?br>
DHQ行(Y坐标)
DLQ列(X坐标)
出口参数Q??br>
功能P03H
功能Q在文本坐标下,d光标各种信息
入口参数QAHQ?3H
BHQ显C页?br>
出口参数QCHQ光标的起始?br>
CLQ光标的l止?br>
DHQ行(Y坐标)
DLQ列(X坐标)
功能P04H
功能Q获取当前状态和光笔位置
入口参数QAHQ?4H
出口参数QAHQ?0h—光W未按下/未触发,01h—光W已按下/已触?br>
BXQ象素列(囑ŞX坐标)
CHQ象素行(囑ŞY坐标Q显C模式:04H~06H)
CXQ象素行(囑ŞY坐标Q显C模式:0DH~10H)
DHQ字W行(文本Y坐标)
DLQ字W列(文本X坐标)
功能P05H
功能Q设|显C页Q即选择zd的显C页
入口参数QAHQ?5H
ALQ显C页
对于CGA、EGA、MCGA和VGAQ其昄如下表所列:
模式 | 昄器类?br>
00H 01H 0~7 CGA、EGA、MCGA、VGA
02H 03H 0~3 CGA
02H 03H 0~7 EGA、MCGA、VGA
07H 0~7 EGA、VGA
0DH 0~7 EGA、VGA
0EH 0~3 EGA、VGA
0FH 0~1 EGA、VGA
10H 0~1 EGA、VGA
功能P06H?7H
功能Q初始化屏幕或滚?br>
入口参数QAHQ?6H—向上滚屏,07H—向下滚?br>
ALQ滚动行?0—清H口)
BHQ空白区域的~省属?br>
(CH、CL)Q窗口的左上角位|?Y坐标QX坐标)
(DH、DL)Q窗口的右下角位|?Y坐标QX坐标)
出口参数Q??br>
功能P08H
功能Q读光标处的字符及其属?br>
入口参数QAHQ?8H
BHQ显C页?br>
出口参数QAHQ属?br>
ALQ字W?br>
功能P09H
功能Q在当前光标处按指定属性显C字W?br>
入口参数QAHQ?9H
ALQ字W?br>
BHQ显C页?br>
BLQ属?文本模式)或颜?囑Ş模式)
CXQ重复输出字W的ơ数
出口参数Q无
功能P0AH
功能Q在当前光标处按原有属性显C字W?br>
入口参数QAHQ?AH
ALQ字W?br>
BHQ显C页?br>
BLQ颜?囑Ş模式Q仅适用于PCjr)
CXQ重复输出字W的ơ数
出口参数Q无
功能P0BH
功能Q设|调色板、背景色或边?br>
入口参数QAHQ?BH
讄颜色QBHQ?0HQBLQ颜?br>
选择调色板:BHQ?1HQBLQ调色板(320×200?U颜色的囑Ş模式)
出口参数Q??br>
功能P0CH
功能Q写囑Ş象素
入口参数QAHQ?CH
ALQ象素?br>
BHQ页?br>
(CX、DX)Q图形坐标列(X)、行(Y)
出口参数Q无
功能P0DH
功能描述Q读囑Ş象素
入口参数QAHQ?DH
BHQ页?br>
(CX、DX)Q图形坐标列(X)、行(Y)
出口参数QALQ象素?br>
功能P0EH
功能Q在Teletype模式下显C字W?br>
入口参数QAHQ?EH
ALQ字W?br>
BHQ页?br>
BLQ前景色(囑Ş模式)
出口参数Q??br>
功能P0FH
功能Q读取显C器模式
入口参数QAHQ?FH
出口参数QAHQ屏q字W的列数
ALQ显C模?参见功能00H中的说明)
BHQ页?br>
功能P10H
功能描述Q颜色中断。其子功能说明如下:
功能受子功能名U?nbsp; 功能受子功能名U?br>
00H 讄调色板寄存器 01H 讄Ҏ颜色
02H 讄调色板和Ҏ 03H 触发闪烁/亮显?br>
07H d调色板寄存器 08H dҎ颜色
09H d调色板和Ҏ 10H 讄颜色寄存?br>
12H 讄颜色寄存器块 13H 讄颜色늊?br>
15H d颜色寄存?nbsp; 17H d颜色寄存器块
1AH d颜色늊?nbsp; 1BH 讄灰度?br>
功能P11H
功能Q?字体中断。其子功能说明如下:
子功能号 子功能名U?br>
00H 装入用户字体和可~程控制?br>
10H 装入用户字体和可~程控制?br>
01H 装入8×14 ROM字体和可~程控制?br>
11H 装入8×14 ROM字体和可~程控制?br>
02H 装入8×8 ROM字体和可~程控制?br>
12H 装入8×8 ROM字体和可~程控制?br>
03H 讄块指C器
04H 装入8×16 ROM字体和可~程控制?br>
14H 装入8×16 ROM字体和可~程控制?br>
20H 讄INT 1Fh字体指针
21H 为用户字体设|INT 43h
22H ?×14 ROM字体讄INT 43H
23H ?×8 ROM字体讄INT 43H
24H ?×16 ROM字体讄INT 43H
30H d字体信息
功能P12H
功能Q显C器的配|中断。其子功能说明如下:
功能?nbsp; 功能名称
10H d配置信息
20H 选择屏幕打印
30H 讄扫描?br>
31H 允许/止装入~省调色?br>
32H 允许/止昄
33H 允许/止灰度求和
34H 允许/止光标模拟
35H 切换zd昄
36H 允许/止屏幕h
功能P13H
功能Q在Teletype模式下显C字W串
入口参数QAHQ?3H
BHQ页?br>
BLQ属?若AL=00H?1H)
CXQ显C字W串长度
(DH、DL)Q坐?行、列)
ES:BPQ显C字W串的地址 ALQ?昄输出方式
0—字W串中只含显C字W,其显C属性在BL中。显C后Q光标位|不?br>
1—字W串中只含显C字W,其显C属性在BL中。显C后Q光标位|改?br>
2—字W串中含昄字符和显C属性。显C后Q光标位|不?br>
3—字W串中含昄字符和显C属性。显C后Q光标位|改?br>
出口参数Q??br>
功能P1AH
功能Q读?讄昄l合~码Q仅PS/2有效Q在此从?br>
功能P1BH
功能Q读取功?状态信息,仅PS/2有效Q在此从?br>
功能P1CH
功能Q保?恢复昄器状态,仅PS/2有效Q在此从?/span>
7.
数组下标界
不要听了批处理文件就感到很神气,其实q东西很单的Q你用过C本没有?用过Q 好的Q将C本打开Q什么都不用写,然后选择文gQ保存.保存cd选择所有文Ӟ文g名则命名为 Q.bat q个Q代表是文g名,你可以随便的P保存好之后,看看你保存的地方Q会出现一个白色窗口里有个黄色齿轮的图标.q东西就是你创徏的批处理文gQ双M可以运行,但他现在׃里面没有输入M命oQ所以他q行了ƈ不会做Q何事情.当我们想往q个Q?bat文g中添加东西时Q只要右键选择他,然后选择~辑Q就可以打开C本往内输入命令了Q[/rm]
批处理文件中的命令是什么?
批处理文件中的命令暂时先可以理解为dos命oQ等E后深入理解了以后再q行解释Q批处理思义是一大堆东西堆在一起处理.换句话说是往里面写一条条dos命oQ然后按序挨个执行Q效果跟你在cmd里敲dos命o是一个效果.只不q用批处理写好之后,要运行只要双M可以运行了Q而不用再一遍一遍的重复的往里面打命令.q就是批处理文g的好处.
除了q行dos命o之外Q他q可以支持选择l构ifQ@环结构forQgoto{,与c有点cMQ但q没有c全面Qƈ且编写语a十分不规范.
批处理语法:
先讲个最基本的东ѝ@echo off
echo的意思是回旋Q这里的意思就是回显,echo off意思就是关闭回显.前面的@表示echo off q一行也不会回显你可以试着L@和整行去掉.@的另一个功能是在执行完批处理文件时自动恢复命o回显。如果第一句用的是ECHO OFFQ那么在执行完批处理文g以后不会昄命o提示W?/p>
举个例子Q如果我们先创徏一个1Qbat文gQ往里面输入Q?/p>
dir 然后保存在cQ\下.然后我们q行cmdQ进入c盘根目录下,输入Q.batQ则昄Q?/p>
C:>1.bat
C:>dir
驱动?C 中的h有标{?/p>
L序列h 0C5D-07FF
C: 的目?/p>
2004-08-25 00:45 WINDOWS
2004-08-25 00:51 Documents and Settings
...........
C:
如果1Qbat内容修改?/p>
echo off
dir
然后再在cmd里输入1QbatQ则会显C?/p>
C:>1.bat
C:>echo off //因ؓq行了echo offQ所以没有显Cdir命oQ直接显CZl果
驱动?C 中的h有标{?/p>
L序列h 0C5D-07FF
C: 的目?/p>
2004-08-25 00:45 WINDOWS
2004-08-25 00:51 Documents and Settings
Q.Q.Q?/p>
C:
如果1Qbat文g修改成:
@echo off
dir
则显C成Q?/p>
C:>1.bat //与前面不同,q没有显Cecho offQ原因是加了Q,所以不昄Q后面的内容Q又因ؓ?了echo offQ所以后面的命o不显C,直接昄l果
驱动?C 中的h有标{?/p>
L序列h 0C5D-07FF
C: 的目?/p>
2004-08-25 00:45 WINDOWS
2004-08-25 00:51 Documents and Settings
Q.Q.
C:
通过以上的比较,怿你对echo off命o已经充分掌握了.
接下来讲的是call命oQ?/p>
call 是打电话的callQ而不是"喔靠Q的靠:Q.call的意思ؓ调用Q假如有Q个批处理文件a.bat和b.batQ如果我惌行a.bat的当中运?b.batQ如何运行呢Q其实很单,只要在a.bat文g中输入call命oQ则可以在a.batq行的当中,q行b.batQ等b.batq行完之后,l箋执行a.bat
call命o格式Q?/p>
CALL [drive:][path]filename [batch-parameters]
batch-parameters 指定批处理程序所需的命令行信息?/p>
举例如下Q我们在c盘根目录下创建aQbat文gQ内容ؓ:
echo this is a.bat
call d:b.bat
echo done
然后在d盘根目录下创建b.batQ内容ؓQ?/p>
echo this is b.bat
保存后,打开cmdQ进入c盘根目录Q然后输?.batQ显C如下:
C:>a.bat
C:>echo this is a.bat
this is a.bat
C:>call d:b.bat
C:>echo this is b.bat
this is b.bat
C:>echo done
done
׃子很Ҏ看出来,是先q行a.bat的内容,直到遇到call b.bat后,则调用b.batQ运行完b.bat后,再返回a.bat接着q行call b.bat后面的echo done语句Q直臛_a.bat的所有批处理命oq行完.
注:里面有个[batch-parameters]里面的所指的参数是什么,知道的朋友能否告知,不胜感激Q?/p>
PAUSE 命o
暂停批处理程序的执行q显CZ条消息,提示用户按Q意键l箋执行。只能在批处理程序中使用该命令?/p>
rem命oQ?/p>
表示此命令后的字Wؓ解释行(注释Q,不执行,只是l自׃后参考用的(相当于程序中的注释)Q?/p>
同时你可以用两个冒号来替代remQ如Q ::{同于一个remQ但他们有个区别Q就是用::作注释的话他是不回显的,即你打echo on强制回显也没有同的.同时rem可以在config.sys中加注释Q?/p>
语法Q?rem[commnet]
批处理文件参敎ͼ
有点~程基础的h都知道函数有参数Q批处理文g也有参数Q?/p>
我打个比方,希望能帮助没有语a基础的h也能看的非常明白Q
我从例子里开始吧Q首先在c盘根目录下创Z个批处理文g aQbatQ里面输入内?/p>
echo %1
然后打开cmdQ然后进入c盘根目录Q输入:a "this is a canshu"
得到l果如下Q?/p>
C:>a.bat "this is a test"
C:>echo "this is a test"
"this is a test"
输入的a "this is a canshu"中,a为新建的a.bat的文件名aQ后面的.bat可写也可不写Q,而a后面的 "this is a canshu"q句话就是参敎ͼ写在q的参数Q在E序q行中就参数自动放到批处理E序中去Q那么放在什么位|呢Q就是放在 %1的地方.
看了例子Q让我们看看整个关于参数的定义如何:
批处理文件还可以像C语言的函C样用参敎ͼ相当于DOS命o的命令行参数Q,q需要用C个参数表C符"%"?/p>
%[1-9]表示参数Q参数是指在q行批处理文件时在文件名后加的以I格Q或者TabQ分隔的字符丌Ӏ变量可以从%0?9Q?0表示批处理命令本w,其它参数字符串用%1?9序表示?/我们上个E序的例子里有Q1Q他是参数Q而输入中Qthis is a testQ作为参数就直接攑ֈQ1的位|,于是E序变成了 echo "this is a test"Q?/p>
再D几个例子帮助你理解:
C:根目录下一批处理文件名为b.batQ内容ؓ:
@echo off
type %1 //type为dos中的输出命oQ可以用来输出文本文件的内容Q比如我们新Z个1Qtxt文g
//里面输入内容Q保存.qcmdQ如果输入1Qtxt则看不了Q.txt文g内容Q但是如果我
//想看怎么办呢Q这时候可以用type命oQ只要在cmd里输入type Q.txtp昄
//Q.txt文g中的内容了
type %2
那么q行C:>b a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的批处理命o变成了
@echo off
type a.txt
type b.txt
于是上面的命令将序地显Ca.txt和b.txt文g的内宏V?/p>
没有~程基础的h可能要问Q干什么要弄个参数啊?在后面加个参数多ȝ啊?直接往里面写不好了啊Q!其实q样x对的斚w也有错的斚wQ还是D个例子说明吧Q?/p>
W一步还是在c盘根目录下新Z个批处理文gQ我们取名仍为a.batQ往里面的内容输入ؓQ?/p>
ping %1 //ping命o可以单理解ؓ试一台机器开着q是没有开Q如果开着的话Q他回l你回送回应.
然后qcmdQ我们想试下1Q3的服务器是不是开着Q则输入a www.163.com
对于知道ping命o的hQ可以打pingq行查,但如果想ping的h不知道ping命o怎么用,那怎么办啊Q这时候你可以把命o预先输入到批处理文g中,保存好,然后让不会用的hqcmdQ运行你的批处理文gQ文件名后面加上他要ping 的网站地址p了.换句话说Q他想ping Q6Q就直接加1Q3的网址Q想ping sinaq接加sina的网址Q这样只要输入一个参敎ͼ而不用改E序本nQ整个程序的通用性就大大提高了.
q是对于一个简单的ping命oQ你或许觉得用参C值得Q还是直接改不就好了啊.但如果程序有很多条,你一下找不到在哪Ҏ么办啊Q所以,不管你是菜哥Q菜弟,菜姐Q菜妹,只要q行下,输入参数Q结果自己就会出来,不用再象你一P考虑怎么~写批处理文Ӟ人家只要知道是输入什么东西能让批处理E序q行Q而编写的人则想的是如何让不懂E序的h能运行程序.
批处理参数就q么单,不知道你理解了没有?但如果你x一步了解批处理参数Q可以接着往下看Q如果不x入了解,知道现在q么多也够了.
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
因ؓ参数只有Q%Q9Q,但当我们要引用第十个或更多个参数? 必ȝ动DOS 的参数v始指? shift 命o正充当了q个Ud指针的角? 它将参数的v始指针移动到下一个参? cMC 语言中的指针操作. 囄如下:
初始状? cmd 为命令名, 可以?%0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
&line; &line; &line; &line; &line; &line; &line; &line; &line; &line;
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
l过1ơshift? cmd 无法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
&line; &line; &line; &line; &line; &line; &line; &line; &line; &line;
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
l过2ơshift? arg1也被废弃, %9指向为空, 没有引用意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
&line; &line; &line; &line; &line; &line; &line; &line; &line; &line;
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
遗憾的是, win9x 和DOS下均不支?shift 的逆操? 只有?nt 内核命o行环境下, shift 才支?/n 参数, 可以以第一参数为基准返复移动v始指?
=================
if goto choice for高语法
if命o
说得通俗点,ifq当于我们白话里的如果Q?/p>
举个例子Q如果a喜欢bQ那么ap娶bQ q句话翻译成计算a成?/p>
if a喜欢b ap娶bQ?/p>
当然拉,计算Z可能理解a喜欢bQap娶bq两句话Q这里只是D个例子让你方便理解.
if语句一共有3U模?如下:
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
IF [NOT] ERRORLEVEL number command
NOT 指定只有条g?false 的情况下Q?Windows XP 才应该执行该命o?/p>
ERRORLEVEL number 如果最后运行的E序q回一个等于或大于指定数字的退出编码,指定条g?true?/p>
string1==string2 如果指定的文字字W串匚wQ指定条件ؓ true?/p>
EXIST filename 如果指定的文件名存在Q指定条件ؓ true?/p>
command 如果W合条gQ指定要执行的命令。如果指定的条g?FALSEQ命令后可跟一个执?ELSE关键字后的命令的 ELSE 命o?/p>
我们先讲解第一U?
IF [NOT] string1==string2 command
自然语句意思:如果string1Q=string2Q那么执行command
下面再D个能实际应用的if语句Q?/p>
自然语句Q如果输入的参数为3Q那么显C"aQ3Q?/p>
计算句:
@echo off
if "%1"=="3" echo "a=3"
或者写?/p>
@echo off
if %1==3 echo "a=3"
注意:当要试的时?因在cmd底下,输入1.bat 3.因ؓq里用了是传递参?具体看文章前部分"批处理文件参?.
W二U:
IF [NOT] EXIST filename command
q条命o用语文件是否存在.如果存在Q执行commandQ如果不存在Q则什么也不显C.
如:我们x查e盘根目录下是否有一个叫Q?txt的文Ӟ如果存在Q则昄existQ如果不存在Q则什么也不显C.
批处理命令如下:
@echo off
if exist e:2.txt echo "exist 2.txt"
W三U:
IF [NOT] ERRORLEVEL number command
q个我引用点资料Q感觉别人写得更详细Q引用部分ؓ色字部分:
if errorlevel 待执行的命o
很多DOSE序在运行结束后会返回一个数字值用来表C程序运行的l果(或者状?Q通过if errorlevel命o可以判断E序的返回|Ҏ不同的返回值来军_执行不同的命?q回值必L照从大到的序排列)。如果返回值等于指定的数字Q则条g成立Q运行命令,否则q行下一句?/p>
如if errorlevel 2 goto x2
==== ?===========
q回g大到的序排列不是必须? 而只是执行命令ؓ goto 时的习惯用法, 当?set 作ؓ执行命o? 通常会从到大顺序排? 比如需返回码|入环境变量, 需使用以下的顺序Ş?
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...
当然, 也可以用以下@环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e //此处Z个for循环Q后面会l箋 介绍到的Q看不懂可以先蟩q去
if errorlevel 比较q回码的判断条gq{于, 而是大于{于. ׃ goto 的蟩转特? 由小到大排序会导致在较小的返回码处就跛_; 而由?set命o?"重复" 赋值特? 由大到小排序会导致较的q回?"覆盖" 较大的返回码.
另外, 虽然 if errorlevel= command 也是有效的命令行, 但也只是 command.com 解释命o行时?= 作ؓ命o行切分符而忽略掉|了
choice命o
goto命o
for命o
for命o其实是一个@环命?如果我们想重复一个语?可以用for命o.通过for命o,可以控制循环的次数等.
语法:
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数?/p>
(set) 指定一个或一l文件。可以用通配W?/p>
command 指定Ҏ个文件执行的命o?/p>
command-parameters
为特定命令指定参数或命o行开兟?/p>
在批处理文g中?FOR 命oӞ指定变量请?%%variable
而不要用 %variable。变量名U是区分大小写的Q所?%i 不同?%I.
不知道你你看懂了没有Q其实还是很Ҏ理解的,q是举个例子吧.我想用type打印所有c盘根目录下的bat文g和txt文gQdos底下命o是 type Q.bat Q?txtQ先该文g保存在c盘根目录?名称为a.bat
用for命o如下Q?/p>
for %%t in (*.bat *.txt) do type %%t
%%t其实是代表的一个参敎ͼ他的内容在in() 里面括号里的内容.也就是说q句话里?%t变成了*.bat *.txt?do是做的意?执行type命o,而type后面?%t,?%t又是*.bat *.txt.所以原来这句命令的意思就变成?
type *.bat *.txt
执行时进cmd,然后到c盘根目录下输入a.bat可以打印出c盘根目录下所有扩展名?bat?txt的文件内容了.
q里要注意:in后面有个I格Q?/p>
在xp底下,for命o扩展名被L因此for的功能变得更加强?下面讲一个真正的循环.
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量Ş式从开始到l束的一个数字序列?/p>
因此Q?1,1,5) 生序?1 2 3 4 5Q?5,-1,1) ?/p>
序列 (5 4 3 2 1)
里面W一?在start的位|?意思是起始位置,W??在step位置,英文意思是跨步,在这里面的意思是每次增量?.后面?在end的位|?意思是l束时的大小.
q句话的意思就是从1(start)开始增?每次增加1(step),一直到变到5(end)为止.
q个有什么用?其实我感觉这个东西的用处q是很大?举个最单的例子,我们想重复回?i am the best"q句?重复昄10?那么for命o如下:
for /L %%e in (1,1,10) do echo "i am the best"
q时,cmd׃重复输入"i am the best"10?
===============================================
现在不知道你对bat有了什么样的理解,我现在的感觉是bat是dos命o的组合,你把dos命o全写qbat命oQ只要运行下bat׃挨个执行dos命oQ这无疑提供了不的方便?/p>
下面我再举些实例.
删除默认׃n:
对于默认׃n不知道你了解多少,反正留着是个隐患,现在唯一的办法好象只能做个bat文gq行删除.命o如下:
net share ipc$ /delete
net share admin$ /delete
net share c$ /delete
net share d$ /delete
net share e$ /delete
……
里面的c d eZ的盘W。如果你只有一个分区,那么写到net share c$ /delete为止可以了。如果你有n个分区,那么挨个写下去?/p>
net share d$ /delete
net share e$ /delete
net share f$ /delete
net share g$ /delete……
登陆到局域网的机器快h?Ҏ机器有密码且?000或以上系l?
net use 2.168.0.1 [密码] /user:[用户名]
explorer 2.168.0.1
bat文g备䆾注册?/p>
set regfile=%date% //讄变量Q下面出?regfile%的都自动替换“当天date”
if exist "%regfile%" goto end //如果发现当天date命名的目录,跛_文g?/p>
md temp //建temp目录
call 1.bat //调用1.bat
del 1.bat
ren 2.bat 1.bat
ren 3.bat 2.bat
ren 4.bat 3.bat
echo move "%regfile%" temp >4.bat //?Ud“当天date命名的目?#8221;到temp的bat文g ?/p>
md "%regfile%" //建当天date命名的目?/p>
cd "%regfile%" //q入
reg export hkcu hkcu.reg //导出注册?/p>
reg export hklm hklm.reg
//HKEY_CURRENT_USER ~写hkcu 。存攑ֽ前用户个人数?/p>
//HKEY_LOCAL_MACHINE ~写hklm 。系l的核心数据
cd..
deltree /y temp >nul ////q回上目录 Q删temp文g?/p>
:end
class CSingleton:
{
// 其它成员
public:
static CSingleton * GetInstance()
{
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
}
private:
CSingleton(){};
static CSingleton * m_pInstance;
}
单例cCSingleton有以下特征:
它有一个指唯一实例的静态指针m_pInstanceQƈ且是U有的?br> 它有一个公有的函数Q可以获取这个唯一的实例,q在需要的时候创实例?br> 它的构造函数是U有的,q样׃能从别处创徏该类的实例?br> 大多时候,q样的实现都不会出现问题。有l验的读者可能会问,m_pInstance指向的空间什么时候释攑֑Q更严重的问题是Q这个实例的析构操作什么时候执行?
如果在类的析构行Z有必ȝ操作Q比如关闭文Ӟ释放外部资源Q那么上面所C的代码无法实现q个要求。我们需要一U方法,正常地删除该实例?br> 可以在程序结束时调用GetInstanceq对q回的指针调用delete操作。这样做可以实现功能Q但是不仅很丑陋Q而且Ҏ出错。因L附加代码很容易被忘记Q而且也很难保证在delete之后Q没有代码再调用GetInstance函数?br> 一个妥善的Ҏ是让q个c自q道在合适的时候把自己删除。或者说把删除自q操作挂在pȝ中的某个合适的点上Q其在恰当的时候自动被执行?br> 我们知道Q程序在l束的时候,pȝ会自动析构所有的全局变量。事实上Q系l也会析构所有的cȝ静态成员变量,像q些静态成员也是全局变量一栗利用这个特征,我们可以在单例类中定义一个这L静态成员变量,而它的唯一工作是在析构函C删除单例cȝ实例。如下面的代码中的CGarboc(Garbo意ؓ垃圾工hQ:
class CSingleton:
{
// 其它成员
public:
static CSingleton * GetInstance()
private:
CSingleton(){};
static CSingleton * m_pInstance;
class CGarbo // 它的唯一工作是在析构函C删除CSingleton的实?br> {
public:
~CGarbo()
{
if (CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static CGarbo Garbo; // 定义一个静态成员,在程序结束时Q系l会调用它的析构函数
}
cCGarbo被定义ؓCSingleton的私有内嵌类Q以防该c被在其它地Ҏ用?/font>
在程序运行结束时Q系l会调用CSingleton的静态成员Garbo的析构函敎ͼ该析构函C删除单例的唯一实例?br> 使用q种Ҏ释放单例对象有以下特征:
在单例类内部定义专有的嵌套类?br> 在单例类内定义私有的专门用于释放的静态成员?br> 利用E序在结束时析构全局变量的特性,选择最l的释放时机?br> 使用单例的代码不需要Q何操作,不必兛_对象的释放?/font>
----------------------------------------------------------------------------------------------------------------------------------
以上是转蝲的一个c++中的单例模式。在q个里面涉及Cm_pInstance指向的空间什么时候释攑֑Q更严重的问题是Q这个实例的析构操作什么时候执行?后面使用的内嵌类Ҏ个h觉得q不是很好,如果又要d另一个单例类是不是也要在内嵌cM删除此单例类的实例呢Q如果我要添?00个呢Q你看有多麻烦啊Q?/font>
以下是对以前目中用到的单例模式的提取Q?/font>
#include <iostream>
using namespace std;
cȝ定义应该是在*.h文g中的Q这里偷懒了
class Singleton
{
public:
Singleton();
static Singleton *GetInstance() ;
};
以下应该?.cpp文g?/font>
static Singleton *instance = NULL;
Singleton::Singleton()
{
instance = this;
}
Singleton *Singleton::GetInstance()
{
return instance;
}
以下是在使用的地?/font>
int main()
{
Singleton singles;
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if (p1 == p2)
{
cout <<"Two objects is the same instance" <<endl;
}
return 0;
}
在以上的E序中,看到q个和zt中的是类似的。也有个同样的问题出C。在q个里面涉及Cm_pInstance指向的空间什么时候释攑֑Q更严重的问题是Q这个实例的析构操作什么时候执行?哈哈Q这个呢在项目中是有处理的,因ؓ是这个单例对象生成后了是要保存在一个容器中的,而且所有的cM单例是对同一个基cȝl承Q所以利用多态特点vector<type*>再加一个P代器可以很ҎҎ有的q些单例对象q行删除操作了。这个应该说是项目在设计的时候就考虑到的了?/font>
q个Q还有没有更好、一x逸的Ҏ呢?朋友看到后告诉了个他看到的很牛的单例写法Q不得不佩服Q真的很牛。后来在CSND论坛上的一个帖子中也看C某位多线E高手也贴出了这U方法?/p>
#include <iostream>
using namespace std;
class Singleton
{
private:
Singleton(){}
public:
static Singleton *GetInstance()
{
static Singleton singles;//在此定义静态对?br> return &singles;
}
};
int main()
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if (p1 == p2)
{
cout <<"Two objects is the same instance" <<endl;
}
return 0;
}
hohoQ而后l箋了下Qؓ了方便,多个写成了模板类形式Q得承自单例模式的自动ؓ单例模式?/p>
#include <iostream>
#include <assert.h>
using namespace std;
template<class type>
class Singleton
{
public:
static type *GetInstance()
{
static type singles;
return &singles;
}
protected:
Singleton(){}
};
class resourcemanage : public Singleton<resourcemanage>
{
public:
resourcemanage(){}
void showlog()
{
cout<<"resoucemange"<<endl;
}
};
class mange : public Singleton<mange>
{
public:
mange(){}
void showtexer()
{
cout<<"show texture"<<endl;
}
};
int main()
{
//Singleton *singles = new Singleton;
resourcemanage *p1 = resourcemanage::GetInstance();
resourcemanage *p2 = resourcemanage::GetInstance();
mange::GetInstance()->showtexer();
p2->showlog();
if (p1 == p2)
{
cout <<"Two objects is the same instance" <<endl;
}
return 0;
}
hohoQ一个单例模式竟然能引出q麽多的东东Q真是学习了不少啊,哈哈哈哈哈哈Q?/p>
最后脓下csdn关于q个单例模式的牛论帖Q?/p>
http://topic.csdn.net/u/20080218/08/291c52f9-5ed0-4f7c-abeb-69f691c2e7f4.html
静态成员变量必要在具体的cpp文g中进行定义,cM出现的静态成员变量只表示一U声明?