c 中類的封裝

2021-06-07 01:35:49 字數 3654 閱讀 6076

,連線directshow filter

cvideo

類中,這樣程式簡潔明瞭,易於操作,不容易出錯,提高了程式的魯棒性。

1. 類的定義:

類是定義同一類所有物件的變數和方法的藍圖或原型。例如,可以建立乙個定義包含當前檔位等例項變數的自行車類。這個類也定義和提供了例項方法(變檔、剎車)的實現。例項變數的值由類的每個例項提供。因此,當你建立自行車類以後,必須在使用之前對它進行例項化。當建立類的例項時,就建立了這種型別的乙個物件,然後系統為類定義的例項變數分配記憶體。然後可以呼叫物件的例項方法實現一些功能。相同類的例項共享相同的例項方法。

c++ 程式設計允許程式設計師使用類

(class)

定義特定程式中的資料型別。這些資料型別的例項被稱為物件,這些事例可以包含程式設計師定義的成員變數、常量、成員函式,以及過載的運算子。語法上,類是

c中結構體(

struct

)的擴充套件,結構體不能包含函式以及過載的運算子。

2. 區別:類和物件

物件和類的說明很相似。實際上,類和物件之間的差別經常是一些困惑的起源。在現實世界中很明顯,類不是它描述的物件 - 

自行車的藍圖不是自行車。但是在軟體中就有點難區分類和物件。這部分是由於軟體物件只是現實世界的電子模型或抽象概念。但是也由於很多人用「物件」指類和它們的例項這兩者。

3. videocapture中封裝類的具體實現

(a)利用

classwizard

新建乙個基於

cwnd

的mfc

類,類名

cvideo。

(b)在attributes中定義變數igraphbuilder * pgraph;用於建立graph filter manager

定義icapturegraphbuilder2 *pbuilder2;用於建立graph stream流

定義imediacontrol *pcontrol;用於**流的控制

定義imediaevent   *pevent;用於***體流事件

(c)在類定義的標頭檔案中,變數是不能被初始化的,變數的初始化在

video

類的建構函式中,在

cpp檔案中,即

cvideo

::cvideo()

中,定義

5個指標變數的初始值為

null

,指標定義的使用之前一定要初始化,這裡為

null。

cvideo的成員函式

getinte***ce()建立

filter graph

的介面

getdevice()獲得系統的攝像頭裝置

mediacontrol()對**流進行控制

void cvideo::getinte***ce() //建立

filter graph

的介面

//graph介面的建立

hresult hr = cocreateinstance(clsid_filtergraph, null, clsctx_inproc,

iid_igraphbuilder, (void **) &pgraph);

if (failed(hr))

messagebox("create graph failed");

// capture graph builder的建立

hr = cocreateinstance (clsid_capturegraphbuilder2 , null, clsctx_inproc,

iid_icapturegraphbuilder2, (void **) &pbuilder2);

if(failed(hr))

messagebox("create capture graph failed");

// 把filter graph 連線到 capture graph

hr = pbuilder2->setfiltergraph(pgraph);

// 獲得**控制和**視窗

hr = pgraph->queryinte***ce(iid_imediacontrol,(lpvoid *) &pcontrol);

if (failed(hr))

messagebox("error");

hr = pgraph->queryinte***ce(iid_ivideowindow, (lpvoid *) &pwindow);

if (failed(hr))

messagebox("error");

hr = pgraph->queryinte***ce(iid_imediaevent, (lpvoid *) &pevent);

if (failed(hr))

messagebox("error");

void cvideo:: getdevice() //獲得系統的攝像頭裝置

icreatedevenum *pdevenum = null;//建立乙個裝置列舉器

hr = cocreateinstance(clsid_systemdeviceenum, null, clsctx_inproc,

iid_icreatedevenum, (void **) &pdevenum);

if(failed(hr))

messagebox("error");

ienummoniker *pclassenum = null;//建立乙個裝置**型別

hr = pdevenum->createclassenumerator(clsid_videoinputdevicecategory, &pclassenum, 0);

if(failed(hr))

messagebox("error");

if(pclassenum==null)

messagebox("pclassenum=null");

// use the first video capture device on the device list.

// note that if the next() call succeeds but there are no monikers,

// it will return s_false (which is not a failure).  therefore, we

// check that the return code is s_ok instead of using succeeded() macro.

imoniker *pmoniker =null; //建立乙個**裝置

ibasefilter * psrc = null; //指向裝置的指標

ulong cfetched;

int count = 0;

while(s_ok == (pclassenum->next(1,&pmoniker,&cfetched)))

//把裝置繫結到裝置指標

count++;

if(count == 1)

hr = pmoniker->bindtoobject(0,0,iid_ibasefilter,(void**)&psrc);

if(failed(hr))

messagebox("pmoniker failed");

4. 效能測試

的類物件即可。

cvideo

類的物件完成攝像頭的

filter

cvideo

C 中的類與封裝

c 中的類與封裝 1,類的組合 1,類不是孤立存在的,類之間都會有一些關係,組合就是類的基本關係之一 2,電腦一般而言是由 cpu 記憶體 主機板 鍵盤和硬碟等部件組合而成 3,學習電腦組裝需要多少時間?學習電腦組裝是否需要學習顯示器 鍵盤 滑鼠 主機板 記憶體等部件的設計與製造?1,我們可以使用乙...

c 中類的封裝性

c 中類的三個特性 1 封裝性 2 繼承性 3 多型性 這裡談一下對類的封裝性的理解 c語言中,我們將多個不同型別的資料放在一起,用struct結構體 c 中,進行了豐富,將資料 成員變數 和函式 成員函式 封裝在一起,起了乙個新的名字class類。struct中預設的變數都是public clas...

C 中的類與封裝

1,類的組合 1,類不是孤立存在的,類之間都會有一些關係,組合就是類的基本關係之一 2,電腦一般而言是由 cpu 記憶體 主機板 鍵盤和硬碟等部件組合而成 3,學習電腦組裝需要多少時間?學習電腦組裝是否需要學習顯示器 鍵盤 滑鼠 主機板 記憶體等部件的設計與製造?1,我們可以使用乙個類,但是可能對類...