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

2021-07-06 10:02:10 字數 3792 閱讀 1507

什麼是交叉引用?

什麼是交叉引用?一言以蔽之,就是: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( int id ) : m_id(id)

textunit::~textunit(void)

page.h:

#pragma once

#include

#include "textunit.h"

#include "document.h"

typedef std::vectorvectextunit;

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::vectorvecpage;

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中。

**如下: 

#pragma once

#include

class page;

typedef std::vectorvecpage;

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::vectorvectextunit;

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,表示文件內元素的基本單位 乙個文件中的全部文字單元物件都有唯一的id。這樣每建立乙個文字單...

disk boot failure 的解決方法

disk boot failure please insert system disk and press enter 這文字的意思是硬碟啟動失敗,插入系統盤後按enter鍵.這種故障多發生在硬碟沒有檢測到的情況下.首先要進入cmos設定選擇 ide hdd audo detecdion 專案,看是...