按照类型名称动态创建对象
1 引言
我的一个实际项目中,由于希望通过一致的接口控制各种型号的设备,并且可以方便的随时扩充,以便将来支持更多的型号。因此,必须在运行时指定设备的型号。
为了使应用程序可以透明的控制各种型号的设备,所以建立了一个简单的继承体系,设计一个协议类(Protocol Class)作为设备的控制接口,并且为每个型号的设备设计 ...
Google C++编程风格指南(八):规则之例外
编程风格指南的使用要点在于提供一个公共的编码规范,所有人可以把精力集中在实现内容而不是表现形式上。我们给出了全局的风格规范,但局部的风格也很重要,如果你在一个文件中新加的代码和原有代码风格相去甚远的话,这就破坏了文件本身的整体美观也影响阅读
规则之例外
前面说明的编码习惯基本是强制性的,但所有优秀的规 ...
C++中的引用(reference)
1.简介
引用是C++引入的新语言特性。从语意上来说,引用就是一个变量的别名,就好象古代人的“字”和“号”,东坡居士和苏轼只是一个人的不同称呼。对引用的操作对变量产生的影响与对变量直接操作完全一样。例如:
int i = 0;
int & iRef = i;
iRef++; // i = iRef = 1
尽管引用不使用指针的操作符(*, ->)但是,它看上去 ...
如何在派生类中的隐藏基类的虚拟重载函数
我创建了一个类,基类中有虚拟重载函数。我想在派生类中改写基类中的虚拟重载函数。代码如下:
#include
class B {
private:
int nNumber;
public:
virtual void test() {
cout
基类中有两个重载的test函数。当我在派生类中改写其中的一个函数时,我觉得另外一个应该在派生类中继承,但编译时出现一下错误 ...
Pentium III处理器的单指令多数据流扩展指令(1)
关键字 :
Pentium,处理器,单指令多数据流扩展指令,SSE,指令集
概要 :
随着Intel Pentium III处理器的发布,给程序设计人员又带来了许多新的特性。利用这些新特性,程序员可以为用户创造出更好的产品. Pentium III和Pentium III Xeon(至强处理器)的许多新特性,可以使她能够比Pentium II和Pentium II Xeon处理器有更快的运行 ...
实现真正意义上的二维动态数组模板
我们可以通过动态数组的反例来确定动态数组应该具有哪些特性。大家都知道以下的方式是定义一个静态数组。
int iCount[10];
int iCount[10][10];
从上面可以看出,定义了静态数组之后,无论程序如果使这个数组,该数组在内存中所占空间的大小,位置是确定不变的。
我们可以得出结论,对于编译器,静态数组的大小和空间是已知 ...
C++字符串完全指引之一:Win32 字符编码
引言
毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏。你也许正在盯着显示器发愁。本指引将总结引进各种字符类型的目的,展示一些简单的用法,并告诉您在必要时,如何实现各种字符串类型之间的转换。
在第一部分,我们将介绍3种字符编码类型。了解各种编码模 ...
读取注册表中一个子键下的所有子键
#include [TR]
TRegistry &temp=*new TRegistry();
TStringList &listvalue= *new TStringList();
TStringList &listkey =*new TStringList();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------- ...
设计模式的解析和实现(C++)之十八-Iterator模式
作用:
提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示.
UML结构图:
解析:
Iterator几乎是大部分人在初学C++的时候就无意之中接触到的第一种设计模式,因为在STL之中,所有的容器类都有与之相关的迭代器.以前初学STL的时候,时常在看到讲述迭代器作用的时候是这么说的:提供一种方式,使得算法和容 ...
宏的妙用
1、概述
C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用。这使 得宏似乎没有了用武之地。实际上,宏还可以做很多事情,笔者也难以全部列举 。这里,仅仅列举几个典型的用法,希望大家能够从中获益。
2、实现多环境兼容
常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用。例如 ...
C++的++和--运算
++是C++的自增运算符,作用是使变量自加1;--是自减运算符,作用是使变量自减1。++和--有两种用法,一种是前缀用法,一种是后缀用法。前缀用法如:++i、--i ,后缀用法如i++、i--,前缀用法跟后缀用法的差别在于前缀时++i的值为完成i加1后的值,--i为完成i减1后的值。例如:假设i的初值为3,执行cout#include
using namesp ...
《Effective C++》读书笔记03:多才多艺的const
const是我们写c++代码时的常客,对于那些我们不希望修改的对象,最好用const进行 修饰。
1.下面来看看一些惯用法:
1 char greeting[] = "Hello";
2 char* p = greeting; //非const指针,非const数据
3 const char* p = greeting; //非const指针,const数据
4 char ...
C++打印STS图形
用循环语句打印下列图案:
STS
#include
using namespace std;
int main()
{
int n=10;
for(int i=1; i
简介C++中的const
1、const 引用是指向 const 对象的引用:
const int ival = 1024;
const int &refVal = ival; // ok: both reference and object are const
int &ref2 = ival; // error: non const reference to a const object
可以读取但不能修改 refVal。同理,用 ival 初始化 ref2 也是不合法的。ref2 是普通的非 const 引用,因此可 ...
《Effective C++》读书笔记07:为多态基类声明virtual析构函数
这个问题在实践中偶尔会碰到,设计一个TimeKeeper基类和一些派生类来记录时间:
1 class TimeKeeper
2 {
3 public:
4 TimeKeeper ();
5 ~TimeKeeper();
6
7 };
8
9 class AtomicClock: public TimeKeeper {}; //原子钟
10 class WaterClock: public TimeKeeper {}; //水钟
在使用时,我们可能会使用factory工厂方法 ...
C和C++语言学习总结(二)
4、函数参数传递
C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递.
"值传递"的示例程序.由于Func1 函数体内的x 是外部变量n 的一份拷贝,
改变x 的值不会影响n, 所以n 的值仍然是0.
void Func1(int x)
{
x = x + 10;
}
…
int n = 0;
Func1(n);
cout
"指针传递"的示例程序.由于Func2 函数体内的 ...
C++指针和数组
数组的指针即整个数组在内存中的起始地址,而数组元素的指针是数组中某一元素所占存储单元的地址。
利用指针法引用数组元素能使目标程序质量高、占内存少、运行速度快。
C++语言中规定:数组名就代表数组首地址,也就是数组第0号元素的地址。如
int a[10];
int *p;
p=&a[0];/*与p=a,是等价的*/
p+i或a+i就是a元素的存储地 ...
C++:阻止派生类(derived class)重新定义虚函数(final&sealed)
阻止派生类重新定义虚函数, 在java和C#中可以很简单的实现(finale&sealed),
但在C++中则需要使用public继承+复合(composition)的方法;
注意: 使用私有继承(private), 无法实现此要求.
如:
/*************************************************
File: test.cpp
Copyright: C.L.Wang
Author: C.L.Wang
Date: 2014-04-11
...
C++:显示接口&运行期多态 和 隐式接口&编译期多态
类(class)和面向对象:
显示接口(explicit interface): 即在源代码中可见, 可以在头文件内看到类的所有接口;
运行期多态(runtime polymorphism):成员函数是virtual, 传入类的引用或指针时, 在运行时, 会自动匹配接口, 可能是基类的接口, 也可能是派生类的;
模板(templates)和泛型编程(generic programming):
隐式接口(implic ...
C++:模板类使用成员函数模板处理隐式(implicit)转换
指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针可以转换为基类指针.
但是模板的实例化(instantiations)之间, 是单独存在的,
派生类的实例化的模板(SmartPtr), 不能转换为基类实例化的模板(SmartPtr);
需要明确的编写, 因为派生类也可以继续做为基类, 产生派生类, 所以无法直接写出构造函数.
使用成员函数 ...