re: wxWidget的HelloWorld eXile 2007-08-27 15:31
模板用得多的,好象就是SmartWin 和 WTL...
我觉得成熟的C++ GUI库,除了MFC,也就是Qt 和 wxWidgets
Qt的元对象机制就是不合标准,其实用起来是很方便的
re: C++测试框架的选择[转] eXile 2007-08-26 21:12
CxxTest需要预处理, windows上还得安装Python, 作者要是直接提供一个可执行文件就好了
re: 规范?! eXile 2007-08-24 16:21
"需要注释的地方, 也就是需要重构的地方.”
这句话的意思是: 良好的代码是自我注释的.
re: [yc]自己实现Lambda eXile 2007-08-22 11:55
阁下的模板技术比我还牛....
re: 规范?! eXile 2007-08-22 11:27
呵呵, 当你好不不容易把文档写出来, 却又发现程序又要改来改去. 以前写的文档又不适用了. 比没有文档更可怕的是错误的文档.
所以我觉得开发文档相对次要, 首先要注重的是, 良好的风格, 独立的模块, 清晰的结构 .
<<重构>>中有一句话: 需要注释的地方, 也就是需要重构的地方.
re: Qt真的好用得痛哭流涕吗? eXile 2007-07-21 14:07
我的感觉是:天亮了,解放了,不用再回到万恶的旧社会了。。。
双重锁同样是不安全的,所以尽量不要采用lazy initialization,
对于early initialization, 一种安全的办法可以参见:
http://www.cppblog.com/eXile/archive/2006/09/27/13034.html
re: VS9中C++少得可怜的更新 eXile 2007-07-12 17:53
对于MS VS, c++标准的支持实在是不能抱什么希望,要用C++0x,看来还得是gcc, gcc4.3估计今年就能推出,它支持C++0x的绝大部分特征
re: 反驳极限编程的四点理由 eXile 2007-07-10 16:20
极限编程的出现正是在现有开发模式下出现一系列问题后的一些探索。不过,适合自己的才是最好的,如果你觉得现有的的知识和经验可以为你解决这些问题,就没有必要为敏捷而敏捷
re: 读《人月神话》 eXile 2007-07-09 12:10
开发周期可以通过软件的的版本升级进行控制,要不软件也不会有1.0, 2.0.....
re: 反驳极限编程的四点理由 eXile 2007-07-09 11:50
呵呵,共同学习,共同提高。
比如说第一点:追求模块化和开放性
模块的高内聚,低耦合是保证这一点的基础,怎么样做到这一点呢?由此产生各种面向对象的设计理论,而设计模式正是在设计方法在实践中产生的高度总结。但是做到这一点是不容易的,需要经过一定的锻炼和积累,应用哪一种设计模式
也不是一开始就能清晰的看出来的。而使用TDD,则强迫你做到这一点。一个模块性不好的单元,是很难进行测试的。程序员最容易犯的毛病,是把焦点过多的集中在实现的细节上,使用TDD,你首先必须把焦点放在功能的接囗上,而良好的接口,正是良好的设计的基础。
re: 反驳极限编程的四点理由 eXile 2007-07-08 23:58
不过从你所说的来看, 主要问题是, 没有了解XP的核心概念, 却盲目套用XP的外在形式,
re: 反驳极限编程的四点理由 eXile 2007-07-08 23:49
呵呵, 相信只要随便翻一翻XP的书, 都会说到这些问题. 不过我还是说一说,
1)极限编程却放弃这种追求 ....
XP追求的正是模块化和开放性
2)结果就是产生一大堆丑陋的代码...
对于个人来说, 如果使用XP后写出的代码很丑陋, 那么可以肯定, 不使用XP写出的代码也不会好到那儿去; 对于开发小组来说,三个月XP实践还存在这种看法, 项目管理只能说是太失败了
3)为什么不在设计初期进行预防呢?
要是在设计初期就能想到所有的变化和细节, 也就不会有XP了
4)关于代码与文档, 测试还是调试, 网上这种文章已经太多了
5)没有必要构造框架之类可复用的东西,无疑是与面向对象思想背道而驰的...
这只能说明你太不了解XP了,
re: 读《人月神话》 eXile 2007-07-08 18:11
正好在书中看到这么句话:
团队人数加倍并不等于开发周期的减半。它可能只会缩短1/3。如果团队超过10 个人的话,增加更多的人员可能反而会延缓项目的进度。
而且项目开发周期越长,团队内的成员对整个项目代码的熟悉度就越少,加上不确定的人员流动,新来人员的业务不熟等其他可能性,这项目会越来越复杂。
总的意思就是,项目人数不能太多,周期不能太长。
re: 读《人月神话》 eXile 2007-07-08 17:55
其实,这也是C++当前所处的境遇,CSDN的BLOG首页推荐上,甚至把C++拿掉了,也难怪,它已完全变成C++初学者的论坛。
对此,个人认为有几个原因:
1)c++越来越专注于特定领域
2)高水平的C++程序员越来越少(很多人是C大牛,但不是C++大牛)
3)c++自身发展的一些失误
re: 反驳极限编程的四点理由 eXile 2007-07-08 01:11
呵呵, 自从我知道了XP以后, 立刻就喜欢上了它, 肯定也有人不喜欢它.这是正常的. 选择你喜欢的开发方式就对了. 不过你对XP的认识存在几个明显的误区, 这些在XP的书里已经说得很清楚了。说实话,你所说的有几个理由,使我甚至怀疑你是大学里面讲软件工程的教授,夸夸其谈,但是和实际脱节。
也不单单是教育的问题. 也不单单是性的问题. 我觉得中国十几岁的孩子的成长环境 , 是没法和美国去比的.
re: 我的计算机情缘 eXile 2007-07-02 11:51
呵呵, 不错!我觉得作为程序员,专业的,优雅的coding会带给人乐趣,也是自己的动力。希望多写出一些技术心得,共同学习,共同进步!
re: OS调试相关的工具(附图,原创) eXile 2007-06-28 12:05
据说对于使用XP编程的人来说,使用调试器是可耻的行为。。。
re: 对研发部的思考 eXile 2007-06-26 15:42
这个要看公司的定位了,大部分大老板们是不懂技术的,所以要帮他们分析一下所在的技术背景和前景,也可以给他们一些书面建议
re: 服务器已经成功搬迁到新机房 eXile 2007-06-24 23:46
支持。。。
re: 面向对象分析方法与算法 eXile 2007-06-24 23:11
算法分析和面向过程的分析好象还不太一样吧?
re: QT中的事件机制 eXile 2007-06-14 13:47
因为Sigal/Slot可以跨线程,还可以指定执行的线程环境,,所以一般情况下没有必要使用自定义事件。
re: 总结帖:为什么玩3D游戏会头晕? eXile 2007-06-12 17:54
我玩CS从来不头晕,但一些菜鸟同学却经常叫喊头晕,原来是这个原因,我比他们精神更集中。
re: 学C语言的阶段 eXile 2007-06-06 18:07
tc也太老了,好多库函数都是过时的东西,要学就学标准c, 《tc函数大全》? 这本书还是扔了吧, win16时代的产物了. 建议初学者使用gcc.
使用VC, 也不要一开始就扑在MFC上. 你没见过使用VC的IDE ,但内部是gcc编译器吧?
一句话: 先使用标准库.
re: C++完美实现Singleton模式 eXile 2007-05-23 01:07
而且前一向老外有一篇文章,说了一下什么情况下,双重锁会失败,我没有细看,总之也是不安全的
re: C++完美实现Singleton模式 eXile 2007-05-23 01:03
这种方式远谈不上完美,一般C++的singleton实现的最大缺陷就是释放的顺序依赖问题,而象ModerC++Design那样,又太复杂了,不实用。
所以,我现在都是用main()中的局部变量来模拟全局变量,能很好用于单件模式 。
re: 求职帖 eXile 2007-05-22 23:59
to Galaxy :
用MFC开发共享软件,这不难为自己吗.
re: tinyxml 的使用,转 eXile 2007-05-14 11:55
作为一个测试程序, WriteXML 中对象的管理很混乱, 也许是lz不拘小节, 但会给人误导...
re: GUI程序也能使用控制台窗口 eXile 2007-05-08 23:31
editbin /SUBSYSTEM:CONSOLE $(TargetPath)
re: GUI程序也能使用控制台窗口 eXile 2007-05-08 23:31
利用editbin不用修改代码, 就可添加控制台
re: 通用的类成员函数调用方法. eXile 2007-04-30 10:36
上面的X不要有实现,这样才能保证MemFunPtr尺寸最大
re: 通用的类成员函数调用方法. eXile 2007-04-30 10:32
这个方法也不是不能使用,不过不要用void*, 要选择一个更大的类型。
如下:
class X;
typedef void (X::*MemFunPtr)(void);
使用MemFunPtr,这样就不会有截断了。
re: 通用的类成员函数调用方法. eXile 2007-04-24 13:47
所以, 这些东西还是使用一些成熟的实现吧!
re: 通用的类成员函数调用方法. eXile 2007-04-24 13:44
发现一个很严重的错误: t2t 函数是错误的.
原因: 一个成员函数指针的大小可能4, 8, 12, 16 byte, 而32位平台sizeof(void*)= 4, t2t会造成截断.
re: 通用的类成员函数调用方法. eXile 2007-04-24 13:14
to 饭中淹 :
这个实际上是如何实现代理 (delegate) 的问题, codeproject 上有很多关于它的讨论.
to 梦在天涯 :
这个主要用于模块之间的解藕
re: 关于DLL中对象的动态创建与删除的问题 eXile 2007-04-23 14:38
re: 界面终于出来一点拉 eXile 2007-04-20 20:56
总感觉用MFC做界面挺痛苦的。。。
re: 关于DLL中对象的动态创建与删除的问题 eXile 2007-04-20 20:35
老兄,我用的不是auto_ptr,而是shared_ptr, 我的做法并没有错。另外,在复杂的系统中,手工管理内存总是有点危险,而shared_ptr已被列为tr1标准,我们不要停留在原始社会,还是用点新技术吧!
使用IOCP, 现在有一个asio, 用起来很简单的.
另外可不可以问一个问题: UDP采用IOCP有没有优化效果?
如果是针对C++客户, 那么采用boost::shared_ptr可以大大减轻内存的管理, 不容易产生内存泄露, 也不会有跨模块释放内存的情况.
与 asio 相比, ACE 用起来实在是太麻烦了. asio 的易用性没得说.
re: 请达人提示一下[未登录] eXile 2007-03-24 00:09
我前一向刚好做过类似的东西, 用C++实现, 只要不要求动态生成, 其实还是很简单的, 只要实现了基本的数值类型, 字符串就可以, 其它对象都是它们的组合, 另外还要考虑以下方面:(1)支持标准容器 (2)字节序的问题
可以参考 MFC 中CArchive 与 boost 序列化库的实现. 另外, boost 提供了xml, text, binary 多种形式, 你也可以直接使用它们, 不一定非要自己做一个
re: 推荐一套猛开发框架,不是偶的 eXile 2007-03-15 11:09
tangram中界面如何同C++对象交互啊, 通过COM接口吗?
re: ADO数据库操作的C++封装 eXile 2007-01-31 15:07
前几日看到有位大哥发布的 ADO 数据库的封装,到处是模板,不免有些头晕....
呵呵,是说的我吗?关于模板,我的看法是,在做库的封装时,可以无所顾忌地使用,以作最大优化,在做业务逻辑时,尽量不要使用,以便于维护。
我做的封装,如下所示,表中有哪些字段,什么类型,一目了然,在此引入模板我觉得是必要的。
struct TUser
{
AdoCol<int> m_id;
AdoCol<std::string> m_name;
AdoCol<int> m_type;
AdoCol<AdoBLOB> m_blob;
};
re: UNICODE 介绍 eXile 2007-01-09 13:33
这两行是错误的:
cout << TEXT("输入新的 C 盘卷标: ");
cin >> volumeName;
cin, cout并不能处理UNICODE,按照Microsoft的风格,可能也要定义一个tin, tout...
要支持UNICODE,各式各样的字符串处理才是困难的地方。
re: [STL] 循环中erase eXile 2006-12-28 12:22
1)打印出被删除的元素, 很简单
struct MyPred
{
bool operator()(int n) const
{
if(n%2 == 0) {cout << "Erasing " << n << endl; return true; }
else return false;
}
};
vector<int> v;
vector_erase_if(v, MyPred());
2)list提供了remove方法,但是set,map没有
(实际上这几行代码都是从STL的list源码中抄出来的,主要用于set 和map);
我的实现 eXile 2006-12-27 21:44
// for vector, deque
template <class Container, class T>
inline
void vector_erase(Container & c, T const& t)
{
c.erase(std::remove(c.begin(), c.end(), t), c.end());
}
template <class Container, class Pred>
inline
void vector_erase_if(Container & c, Pred pred)
{
c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());
}
// for list, set, map
template <class Container, class T>
void list_erase(Container & c, T const& t)
{
typename Container::iterator
b = c.begin(), e = c.end(), prev = b;
while (b != e)
{
++b;
if (*prev == t) c.erase(prev);
prev = b;
}
}
template <class Container, class Pred>
void list_erase_if(Container & c, Pred pred)
{
typename Container::iterator
b = c.begin(), e = c.end(), prev = b;
while (b != e)
{
++b;
if (pred(*prev)) c.erase(prev);
prev = b;
}
}
re: 完整的WTL文档 eXile 2006-11-23 00:09
不错, 支持.