文章列表
#include<iostream>
#include <windows.h>
#include "expat.h"
using namespace std;
#ifdef XML_LARGE_SIZE
#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
#define XML_FMT_INT_MOD "I64"
#else
#define XML_FMT_INT_MOD "ll"
#endif
#el ...
1.智能指针
智能指针封装了 QueryInterface / Release 以及 CoCreateInstance / Release 两对方法,因此使用该类的用户不用担心com是否被释放。 ATL提供了两个智能指针类: CComPTR / CComQIPtr。
CComPtr<IMath> ptrMath;
HRESULT hr;
hr = CoCreateInstance(CLSID_Math,
NULL,
...
ATL(Active Template Library,活动模板库)使用c++模板作为自己的实现的基本特性。模板分为两种:函数模板和类模板。
一. ATL如何使用模板
以下例子并没有涉及真正的ATL类,只是展示ATL如何使用模板计数在基类里访问成员函数。首先我们看下面的两个类:
class CBase
{
public:
CBase(){}
~CBase(){}
void BaseMethod()
{
cout << "BaseMethod in Base" << endl;
}
};
...
Com里面的引用计数使用要特别小心,为了避免误调AddRef和Release,我们可以使用以下一些方法来简化编程。
一. 使用智能指针
智能指针实际上重载了-->操作符,所有在智能指针上调用的函数,实际上上都转发到了内部的接口指针上。而当智能指针离开了作用域的时候,会自动调用析构函数,而我们可以在析构函数中对内部的接口指针调用Release操作。在ATL中,有实现好的模板类,CComPtr, CComQIPtr.
一. HRESULT
对于该返回值,只要记住一点,一定要使用SUCCEEDED和FAILED宏来判断,不要直接把它与S_OK,S_FALSE等等来比较。
二. GUID
包含头文件OBJBASE.H。 由于GUID值占用了16个字节,因此一般不用值传递GUID参数 ...
有一些东西是一定要动手实现的,学习有的点可以慢慢积累,但是有一些基本的盲区是一定不要跨过去的。
这里不过多的讲解Dll的内容,只是记录一下常用的两种dll编写方法。
一. Dll的编写
第一种方法:
首先打开vs2010---> win32 application--->选择一个dll工程(MyDll)---->不要选择空项目,让它帮你生产dllmain函数入口。你熟悉以后也可以自己写。
// dllmain.cpp
#include "stdafx.h"
BOOL AP ...
(1)Com组件是?
Com组件是以Win32动态链接库(DLL)或可执行文件(EXEs)的形式发布的可执行代码组成的。
(2)接口概念
DLL的接口就是它所输出的那些函数;C++类的接口则是该类的一个成员函数集。对于Com来说,接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数的地址。对于Com而言,接口就此内存结构。
(3)接口的作用
在Com中接口就是一切。对于客户来说,一个组件就是一个接口集。客户只能通过接口才能同com组件打交道。
用类C++的方法来实现组件
(1)接口定义
#de ...
c++---高级技术
- 博客分类:
- c++
1. 异常对象没有专门的头文件。
2.不应该抛出指向局部对象的指针以及局部对象。
3.异常的类型与与catch说明符完全匹配:
(1)允许从非const 到 const的转换。
(2)允许从派生类到基类的转换。
(3)将数组转换为指向数组类型的指针,将函数转化为指向函数类型的指针。
不允许标准算术转换,比如int到double;不允许类类型定义的转换。如下例子:
/*
功能:1.测试异常类需要头文件吗?答案:不需要
2.测试try中的局部对象在throw对象时能否丢局部变量? 答案: 在throw ...
先参考http://blog.csdn.net/iamkila/article/details/7266890
1. 如何设计一个不能被继承的类
http://snoweagleofself.blog.163.com/blog/static/9446014320088183176994/
各类公司2014笔试题
- 博客分类:
- 算法
美团:
http://www.itmian4.com/forum.php?mod=viewthread&tid=3511&fromuid=1
http://www.itmian4.com/forum.php?mod=viewthread&tid=3463&fromuid=1
创新工场:
http://www.itmian4.com/forum.php?mod=viewthread&tid=3512&fromuid=1
1.题目:给定数组A,大小为n,数组元素为0到n-1的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。要求在O(n)的时间复杂度,O(1)的空间复杂度下完成。
解答:这种题目,既然只用这么少的空间,要么从异或角度考虑,相当于只能有一个变量出现。要么充分的利用给定的数组空间。而且时间复杂度为O(n)的话,必然就是遍历那个数组了。
我们理解一下这个概念:
假如一个数组中某个数字是 a[i] = t ( 0<=t < n ),那么 如果 a[i] = t ...
equals默认的比较是比较两个对象的引用是否相等,在Java里面,所有的东西都是对象,就像c++里面的指针new出来的东西,因此不可能有两个是一样的,当我们想改变这种判断准则时,则必须重写equals方法,比方说当两个对象所代表的值相等我们就认为他们相等。
hashCode方法主要是返回这个对象在内存中的hash码,这个hash码是唯一标识这个对象的,跟着需要重写他的原因是为了常规协议,因为通常我们说,两个对象如果相等,那么他们的hash码也应该是要相等的,满足概念上的一致性,特别是在容器的应用方面,例如set, 会导致我们存储两个相等的对象(因为hashCode不 ...
图论----拓扑排序
- 博客分类:
- 算法,数据结构
拓扑排序是,将有向图中每个点按照一定的顺序排列。如果有向边 vi->vj存在,那么vi结点必须出现在vj之前。
算法思想:
(1)首先我们利用邻接表保存图结构。
(2)利用一个数组indegree[]数组来记录每个结点的入度。
(3)将入度为0的点加入到堆栈 stack中。
(4)将结点node出栈,清除node发出每一条边node->to,并将indegree[to]--。
(5)继续寻找入度为0的点,加入栈,直到栈为空。
时间复杂度:O(V+E)
#include <iostream&g ...
动态数组的相关知识(转载)
- 博客分类:
- 算法,数据结构
对于简单的一维数组动态内存分配和释放,相信大家都是知道的,不过还是举个例子吧:
int *array1D;
//假定数组长度为m
//动态分配空间
array1D = new int [m];
//释放
delete [] array1D;
如果我们使用const来修饰数组的话,必须这样来定义:
const int *a = new int[10](),必须加上(),意思是同时初始化为0,否则以后就没有机会初始化了。
但是,对于多维数组动态分配,大家可能不太熟悉。下面以常见的二维和三维数组为例来说明:
1. 二维数组的动态分配和释放
i ...