交叉引用的解決方法 類宣告的應用

2021-07-03 18:39:56 字數 4196 閱讀 7203

什麼是交叉引用?一言以蔽之,就是:a類中包含b類的物件,b類中包含a類的物件。

我們先來看乙個場景。假設有乙個電子文件(document)、乙個文件下有多個頁(page),每個頁下有多個文字單元(textunit,表示文件內元素的基本單位),乙個文件中的所有文字單元物件都有唯一的id。這樣每建立乙個文字單元時都要為其設定乙個唯一的id,我們在document類中就需要乙個生成唯一id的方法為所有的文字單元建立唯一標識。於是我們就會有下面的類關係設計圖:

於是我們想當然的會有這樣的**:

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 identifier

1>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.h文字中加入page類的宣告:calss page; 把include 「page.h」放到document.cpp中。

2.page.h文字中加入page類的宣告:calss document; 把include 「document.h」放到page.h中。

**如下:

document.h:

#pragma once

#include

class page;

typedef

std::vector

vecpage;

class document

;

document.cpp:

#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.h:

#pragma once

#include

#include "textunit.h"

class document;

typedef

std::vector

vectextunit;

class page

;

page.cpp:

#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,表示文件內元素的基本單位 乙個文件中的所有文字單元物件都有唯一...

類的定義 宣告和引用

什麼是實體?客觀世界中存在的某個事物是實體,程式中通過對實體抽出若干的特徵和功能來抽象的描述實體,特徵是實體的靜態屬性,功能是實體的動態屬性。抽象描述學生 特徵 姓名 學號 性別 年齡 身高 功能 學習 跑步 聽 說 讀 寫 特徵和功能密切相關,不可割裂 物件 實體的特徵 資料 實體的功能 函式 什...