程序开发其实本质上和语言没有太大的关系,语言是一个实现程序的工具。程序开发,有自己要解决的问题,要高效的开发程序,必须要对这些问题给一个好的解决。这也就是说可以通过很多语言来学习程序开发。不必太拘礼这个问题,可以用丢骰子的方法来解决选择语言的问题。
推荐语言,C++或JAVA。毕竟是两种非常流行的语言,学好了工作比较好找,毕竟大多数人学这玩意是为了个饭碗。相比下JAVA的市场好像大些(特别是在企业级信息管理市场),工资也比较高。JAVA还有一个好处,就是它的开发范型比较单纯,概念相对好掌握。C++在系统开发方面的优势比较明显,开发的方法灵活,对喜欢自由性格的人比较合适。C++如果能学好,对程序开发的理解将相当的深刻,好像可以达到手中无剑,心中亦无剑的境界(特别是能深刻理解范型开发后)。
选择一个语言后一定要坚持的用下去,这个样才能大有收获,不要今天说什么好就学两下,明天说什么后就学两下,那样学什么语言也没有用。
posted @
2007-01-29 22:15 walkspeed 阅读(356) |
评论 (1) |
编辑 收藏
接口,通俗的来说就是定义了一组要实现的功能,这些功能被表现为一组函数,
这些函数在语义上给定接口实现类的责任。
C++中常用的定义接口的方法是纯虚类。但是定义的函数却是要确定操作类型的
但是从接口在语义上的考虑,其实是不需要的。
用模板技术来改变。
定义一个接口类,在类中只定义接口函数,这些函数是Client要使用的,这个
类是一个模板类,如下
template< typename T >
class Interface
{
public:
template< typename T1 >
void Fun( const T &t );
......
};
这种方式解决了接口函数被类型限制。
模板类的参数是一个继承类,这个继承类完成实际的操作。实体类的定义如下
class C : public Interface< C >
{
......
};
子类去一个个的实例话其实很不好,也不符合一般C++的编程方法。由于在模板
编程的情况下,更注重的是语义的符合,所以可以在子类中使用重载的方法去实现对
不同类型的实际处理(毕竟没有类的编写者知道自己这个类要处理的类型)。那么可
以载接口类中写些代码,来调用子类的函数,这种调用实际上在语义上定义了子类要
实现的责任。上面的接口的定义变成下面这个样子
template< typename T >
class Interface
{
public:
T* This( void ) { return static_cast< T* >( this ); }
template< typename T1 >
void Fun( const T &t )
{
this->This()->Ope( t );
}
......
};
这样,子类只用实现对不同类型的处理的Ope函数了,对外的公共接口还是一样的。
显现中要讲基类编程子类的友员,Ope定义在protected或private作用域中。
posted @
2007-01-13 18:06 walkspeed 阅读(2283) |
评论 (0) |
编辑 收藏
开发方法很多,从大学中学到的瀑布式的工程方法(虽然书中有说别的方法,但其实只讲了这一个方法)。这种将一切问题都确定后,生成文档,在开始编程的方法越来越不适用了。不过我见过的公司里的管理层特喜欢用,特别是那些没有搞过开发,凭着一张嘴的管理出生的管理者。
世界是变化的,软件要解决的问题也是不断的变化(人是善变的)。
posted @
2006-12-18 20:51 walkspeed 阅读(259) |
评论 (1) |
编辑 收藏
类之间的通讯和定位的封装好是头疼呀。思考了好长时间还是没有什么好的解。
通讯时的不通参数类型和数量,获得响应的实体类。
事件,消息,命令。表面上看差不多,妈的私底下又是有差别的,封装不通,传递不通。还有不通的概念定义和解释。
posted @
2006-10-14 12:20 walkspeed 阅读(223) |
评论 (1) |
编辑 收藏
记得在刚开始学习C++的时候,有一条规定,就是在基类中声明的虚函数,在子类中重载时不要改变这个函数的作用域。例如在基类public中声明的虚函数,在其子类中重载时还应该时public的。
但我在看DirectShow的代码中发现有的子类改变了父类的虚函数的作用域。先开始想,那帮人怎么会犯这么低级的错误,后来一想应该有其原因。在思考后,觉得改变了父类虚函数的作用域是一件很有趣的事情。如果子类的实例被转换成父类,这个函数是可以调用的,而当他是子类时是不行的。
突然我发现,这样就要了一个层次的关系,在父类一层,何子类一层。当一个用户在不同的层次时,操作的权利是不同的。它起到了某种限制。
呵呵,好精致的玩意。
posted @
2006-09-15 22:13 walkspeed 阅读(633) |
评论 (2) |
编辑 收藏
前两两天才开始研究XVID,下了开源的包,按网上写的方法怎么也没编译过去,后来自己把它编出来了。现在写下来与大家分享。
VC6下面我是怎么也没编译成功,个人认为在VC6下面是编译不出来的,大家不用再试了。
我是用VC2003编译出来的。下一个NASM.EXE,放到你的安装目录\Microsoft Visual Studio .NET 2003\Common7\Tools 下面就可以了。
将所有asm文件命令行中如下的语句
nasm -f win32 -DPREFIX -o "$(IntDir)"\"$(InputName)".obj "$(InputPath)"
改为
nasm -f win32 -DPREFIX -o $(IntDir)\$(InputName).obj $(InputPath)
将如下语句
nasm -f win32 -DPREFIX -I"$(InputDir)"\ -o "$(IntDir)"\"$(InputName)".obj "$(InputPath)"
改为
nasm -f win32 -DPREFIX -I$(InputDir) -o $(IntDir)\$(InputName).obj $(InputPath)
编译就ok了
posted @
2006-06-13 22:41 walkspeed 阅读(2280) |
评论 (7) |
编辑 收藏
仿函数就是使对象使用行为看上去像个函数。
函数的使用是这个样的
Function(param1,param2,...)
而对象的使用是这个样的
Object.memberfunction(param1,param2...)
而仿函数对象的使用是这个样的
Object(param1,param2,...)
这样我们可以看出,从外表上看,仿函数对象和函数是一个东西。呵呵,当然他们是不同的。他们一样不过是在使用的外形上一样罢了。
一个仿函数类如下定义
class ObjectFunction
{
.......
public:
返回的类型 operator() ([param1,param2,...]);
};
例1
class ObjectFunction1
{
.......
public:
void operator() () { count << "No Param ObjectFuntion" << endl;
};
例2
class ObjectFunction2
{
........
public:
bool operator() (int x)
{
count << "Have Param ObjectFuntion" << endl;
count << "This is ObjectFuntion's Param" << x << endl;
return true;
}
}
仿函数的关键是要实现 operator() 运算符。
posted @
2006-03-23 23:22 walkspeed 阅读(5692) |
评论 (7) |
编辑 收藏
仿函数,就是是一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
在我们写代码时有时会发现有些功能的实现的代码,会不断的在不同的成员函数中用到,但是有不好将这些代码单立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。而起这些仿函数,还可以用关联,聚合,依赖的类之间的关系,于用到他们的类组合在一起,这样有利于资源的管理(这点可能是它相对与函数最显著的有点了)。如果在配合上模板技术和policy编程思想,那就更是威力无穷了,大家可以慢慢的体会。
在下只是抛砖引玉,希望大家多多指教。
posted @
2006-03-22 22:15 walkspeed 阅读(791) |
评论 (3) |
编辑 收藏