什麼是交叉引用?一言以蔽之,就是:a類中包括b類的物件。b類中包括a類的物件。
我們先來看乙個場景。如果有乙個電子文件(document)、乙個文件下有多個頁(page),每乙個頁下有多個文字單元(textunit,表示文件內元素的基本單位),乙個文件中的全部文字單元物件都有唯一的id。這樣每建立乙個文字單元時都要為其設定乙個唯一的id。我們在document類中就須要乙個生成唯一id的方法為全部的文字單元建立唯一標識。於是我們就會有以下的類關係設計圖:
圖1 :類的關係圖
於是我們想當然的會有這樣的**:
textunit.h:
#pragma once
class textunit
void setid(int id)
private:
int m_id; //文字物件的唯一標識
};
textunit.cpp:
#include "stdafx
.h"#include "textunit
.h"textunit
::textunit(void)
textunit
::textunit(
intid ) : m_id(id)
textunit::~textunit(void)
page.h:
#pragma once
#include
#include "textunit.h"
#include "document.h"
typedef
std::vector
vectextunit;
class page
;
page.cpp:
#include "stdafx.h"
#include "page.h"
page::page(document* pdocument) : m_pdocument(pdocument), m_pvectextunits(new vectextunit)
page::~page(void)
m_pvectextunits->clear();
delete m_pvectextunits;
m_pvectextunits = null;
}textunit* page::addtextunit()
m_pvectextunits->push_back(ptextunit);
return ptextunit;
}
document.h:
#pragma once
#include
#include "page.h"
typedef
std::vector
vecpage;
class document
;
document.cpp:
#include "stdafx.h"
#include "document.h"
int document::s_id = 0;
document::document(void) : m_pvecpages(new vecpage)
document::~document(void)
m_pvecpages->clear();
delete m_pvecpages;
m_pvecpages = null;
}int document::generateid()
page* document::addpage()
m_pvecpages->push_back(ppage);
return ppage;
}
好,**寫完了,我們對它進行編譯。這時你會發現一堆的錯誤:
1>d:\部落格文章\c++高階編輯\projects\crossreference\crossreference\document.h(6): error c2065: 『page』 : undeclared identifier1>d:\部落格文章\c++高階編輯\projects\crossreference\crossreference\document.h(6): error c2059: syntax error : 『>』
1>d:\部落格文章\c++高階編輯\projects\crossreference\crossreference\document.h(9): error c2143: syntax error : missing 『;』 before 『;僅僅有類(t)定義完畢,它才是乙個完整的型別,才是可見的(才可被建立和使用)。
而我們的程式如今就出現這樣的非常有意思的狀態:在定義document時,發現page還未定義完整(document中有page型別的成員);在定義page的時候發現document還未定義完整(page中有document型別的指標物件)。也就是說document不知道page。page不知道docunent,這時就像兩僅僅狗打架,a狗咬著b狗的尾巴,b狗咬著a狗的尾巴。
1.在document.**本中加入page類的宣告:calss page; 把include 「page.h」放到document.cpp中。
2.page.**本中加入page類的宣告:calss document; 把include 「document.h」放到page.h中。
**例如以下:
document.h:
document.cpp:#pragma once
#include
class page;
typedef
std::vector
vecpage;
class document
;
page.h:#include "stdafx.h"
#include "document.h"
#include "page.h"
int document::s_id = 0;
document::document(void) : m_pvecpages(new vecpage)
document::~document(void)
m_pvecpages->clear();
delete m_pvecpages;
m_pvecpages = null;
}int document::generateid()
page* document::addpage()
m_pvecpages->push_back(ppage);
return ppage;
}
page.cpp:#pragma once
#include
#include "textunit.h"
class document;
typedef
std::vector
vectextunit;
class page
;
#include "stdafx.h"
#include "page.h"
#include "document.h"
page::page(document* pdocument) : m_pdocument(pdocument), m_pvectextunits(new vectextunit)
page::~page(void)
m_pvectextunits->clear();
delete m_pvectextunits;
m_pvectextunits = null;
}textunit* page::addtextunit()
m_pvectextunits->push_back(ptextunit);
return ptextunit;
}
交叉引用的解決方法 類宣告的應用
什麼是交叉引用?一言以蔽之,就是 a類中包含b類的物件,b類中包含a類的物件。我們先來看乙個場景。假設有乙個電子文件 document 乙個文件下有多個頁 page 每個頁下有多個文字單元 textunit,表示文件內元素的基本單位 乙個文件中的所有文字單元物件都有唯一的id。這樣每建立乙個文字單元...
交叉引用的解決方法 類方法的應用
什麼是交叉引用?什麼是交叉引用?一言以蔽之,就是 a類中包含b類的物件,b類中包含a類的物件。以一場景為例 我們先來看乙個場景。假設有乙個電子文件 document 乙個文件下有多個頁 page 每個頁下有多個文字單元 textunit,表示文件內元素的基本單位 乙個文件中的所有文字單元物件都有唯一...
類的定義 宣告和引用
什麼是實體?客觀世界中存在的某個事物是實體,程式中通過對實體抽出若干的特徵和功能來抽象的描述實體,特徵是實體的靜態屬性,功能是實體的動態屬性。抽象描述學生 特徵 姓名 學號 性別 年齡 身高 功能 學習 跑步 聽 說 讀 寫 特徵和功能密切相關,不可割裂 物件 實體的特徵 資料 實體的功能 函式 什...