云风工作室
『2002旧流言』 | 『2001旧流言』 | 『1997旧流言』

不再提供留言服务,仅能浏览旧留言。


今天终于看到云大哥了...比想象中瘦一点,呵,是不是觉得成都很冷..

回复 | (120) | 寒冰 | 2003-12-08 01:09:04

有谁写过coff->omf的工具?BCB里有一个,但是我想同时转换VC中C++的东西到BCB中(lib文件)本来用COM的,但是一直不喜欢COM,想换一种手段。

回复 | (119) | bad_fish | 2003-12-07 11:34:37

看看而已,我只是路过,云风,梦幻西游还不错。

回复 | (118) | 鬼豕千寻 | 2003-12-05 10:29:34

C++对象计数

对某类对象计数有时是很有必要的, 尤其是利于调试. 因为一些内存泄露的 bug 的表象就是某些对象不停的被分配而没有释放. 对象的数目在短期膨胀到一个极大的值. 通常我们会写这样一个 template 来干这种事情:

template <typename T>
class counter {
public:
	counter() { ++_count; }
	~counter() { --_count; }
	int current_count() const { return _count; }
private:
	static int _count;
};

template<typename T> int counter<T>::_count=0;

在需要记数的 class 里放一个 counter 成员就够了 :) 例如:

class foo {
	counter<foo> _counter;
	// ...
};

然后任何时候都可以用 _counter.current_count() 取到当前对象的数目.

在完成其它功能(比如记录下高峰时对象最多的数目)前, 重新审视一下这个 template, 它有 bug 吗? 真的在任何合法的情况下都能正常工作吗? _count 有可能被减为负数吗?

回答是, 隐患是存在的! 这就是这篇文章想讨论的有趣问题. 因为 counter 没有写 copy ctor. 如果包含它的类也没有写 copy ctor, 编译器会自动产生一个. 但是, 由于 counter 本身是没有非静态成员变量的, 属于一个POD 类型. 所以它的 copy ctor 什么都不会做. 当然也不会 ++_count 了.

你可以试一下以下代码:

class foo {
public:
	counter<foo> _counter;
};

void main()
{
	foo f1;
	foo f2(f1);
	printf("%d",f2._counter.current_count());
}

答案是 1 还是 2 ?

当然如果 class foo 有自己的 copy ctor, 答案又成了正确的 2. 因为在调用 foo 的 copy ctor 之前, 会调用 counter 的默认构造函数了.

下面随便写一些有趣但不复杂的代码, 完善这个 counter, 可以使每个 counter 都把自己注册到 counter_log 中方便检阅:

class counter_data;

class counter_log {
public:
	static counter_log& instance() {
		static counter_log __inst;
		return __inst;
	}
	void add(const char *name,counter_data *cd) {
		log_[name]=cd;	
	}
	~counter_log() {}
	void output() const; // 这个函数的实现取决于实际的运用.
private:
	counter_log() {}
	std::map<const char *,counter_data *> _log;
};

class counter_data {
	int _counter;
	int _max;
public:
	counter_data(const char *name=0) {
		counter_log::instance().add(name,this);
	}
	~counter_data() {}
	void inc() { 
		if (++_counter>_max) {
			_max=_counter;
		}
	}
	void dec() {
		--_counter;
	}
	int current_count() const { return _counter; }
	int max_count() const { return _max; }
};

template <typename T>
class counter {
public:
	counter() { _data.inc(); }
	~counter() { _data.dec(); }
	counter(const counter &) { _data.inc(); }
	int current_count() const { return _data.current_count(); }
	int max_count() const { return _data.max_count(); }
private:
	static counter_data _data;
};

template<typename T> counter_data counter<T>::_data=counter_data(typeid(T).name());

回复 | (117) | 云风 | 2003-12-04 04:26:23

嘿嘿.周末去成都蹭饭 :)

回复 | (116) | 云风 | 2003-12-04 12:38:23

云风近来可有留意这个游戏,看来会红哦,这里有演示的视频http://www.avl.com.cn/game/cs/bf1942/desertcombat/update/1030-1.htm

回复 | (115) | `海风 | 2003-12-04 12:42:39

回复(110): 当然可以. python 可以调用 C++ 的东西. C++ 也可以调用 python 的东西. 这就够了

回复 | (114) | 云风 | 2003-12-03 10:00:42

回复(108): 可惜设计模型必须在项目中领悟,刚靠看书是没用的. 只需要加入正规的开发团队干上一年, 自然都明白了. 自己一个人做东西也行. 但是写 demo 什么的就用不上了.

回复 | (113) | 云风 | 2003-12-03 09:55:21

回复(105): 真同情你,见人就乱咬,最可怜的是名字都不敢留,鄙视你!

回复 | (112) | goldensun | 2003-12-03 07:28:10

回复(98): 2000多封都没有收到本地?

回复 | (111) | Netelf | 2003-12-03 04:21:11

云风,我刚开始学习Python,看了你以前的留言,我现在想将它迁入我写的VC程序里作为内嵌脚本运行,不知是否可行,能否点拨一下我该如何做,谢谢。

[114 回复]

回复 | (110) | Netelf | 2003-12-03 04:19:34

我有一个想法,云风是否也可以做一个入门教程什么的,或者出些题目,由浅入深,比方说写一个俄罗斯方块之类的题目,然后给一些类似提示的文字描述,这样或者可以帮助像我这样的想入门的人。 :) 哦,当然,在不影响你工作的前提下。

回复 | (109) | `海风 | 2003-12-02 10:13:35

回复(99): 哈哈,倒也说的是,我自己也明白要学的东西太多了。可是,我的生命有限啊!我很心急想快点有点成绩来,所以才有以上的那番言论。至于设计模式 『More』

[113 回复]

回复 | (108) | `海风 | 2003-12-02 10:09:39

回复(99): 不懂设计模式还敢说自己理解面向对象?要学的东西太多了,不要急噪。

回复 | (107) | analyst | 2003-12-02 08:26:09

恭喜恭喜,不错~最近忙啥呢

回复 | (106) | Libra++ | 2003-12-01 06:30:08

你是垃圾啊

[112 回复]

回复 | (105) | 0 | 2003-12-01 12:28:24

云风你好,请问那个AC,DC的huffman表是怎么编出来的,我手头有DC的Huffman 表,可是那个AC的表有130那么大,麻烦你告诉我这张表是怎么算出来的,谢谢你先拉.

回复 | (104) | goldensun | 2003-12-01 10:38:07

回复(102): 这种事情怎么能找到我头上(._.!)也正好,一个游戏玩了半年已经够了,换新游戏玩吧.老玩同一个东西烦不烦啊.

回复 | (103) | 云风 | 2003-11-30 07:37:43

有事找你们帮帮忙 我是一个传奇爱好者,玩了半年多传奇了,打了好多传奇里的好装备,可在前几天我的帐号被别人盗了,可我的帐号又没有密码保护 『More』

[894 回复]

回复 | (102) | 博乐仙子 | 2003-11-30 02:40:24

回复(93): 破车。带点什么东西都不行。

回复 | (101) | BenevolentLiao | 2003-11-29 07:41:56

回复(98): 没什么好可惜的,旧的不去,新的不来。

回复 | (100) | BenevolentLiao | 2003-11-29 07:39:14
[首页][上一页][下一页][末页]

本主页全部页面都使用文本编辑器逐行写成
手工制品,质量保证 :-)

©1997-2006 云风工作室. All rights reserved.