程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 頭文件相互包含的問題

C++ 頭文件相互包含的問題

編輯:C++入門知識

C++ 頭文件相互包含的問題


今天在看C++ Primer第7章,一個習題是要寫兩個類,一個是Screen類,一個Window_mgr類,其中,Window_mgr類包含有一個vector類型的成員 和一個clear函數,用於操作Screen類,所以需要把clear函數聲明為Screen類的友元函數,這樣就需要在定義Screen類的頭文件中包含Window_mgr類的頭文件,同理也需要在Window_mgr類中包含Screen類的頭文件,如下:

Screen.h

#ifndef SCREEN_H
#define SCREEN_H
#include Window_mgr.h
class Screen
{
	friend void Window_mgr::clear();
	........
};
#endif

 

Window_mgr.h

#ifndef WINDOW_MGR_H
#define WINDOW_MGR_H
#include Screen
class Window_mgr
{
public:
	void clear();
	........
private:
        vector screens;
};
#endif

 

main.cc

 

#include Window_mgr.h
#include Screen.h
int main()
{
	........
	return 0;
}

開始的時候按照上面的方式寫,編譯出現錯誤,說在Screen.h文件中 Window_mgr未定義。

 

原因如下:

按照上面的寫法,在編譯前,main.cc文件會變成如下:

 

#define WINDOW_MGR_H
#define SCREEN_H
class Screen
{
	friend void Window_mgr::clear();
	……..
};

class Window_mgr
{
public:
	void clear();
	……..
private:
	vector screens;
};

顯然Window_mgr的定義在friend void Window_mgr::clear() 後邊,所以會出錯。

 

所以,應該在clear 函數的聲明前,添加Window_mgr類的前置聲明。class Window_mgr;

修改Screen.h文件如下:

 

#ifndef SCREEN_H
#define SCREEN_H
class Window_mgr;
class Screen
{
	friend void Window_mgr::clear();
	........
};
#endif

 


這樣就可以正常的編譯了。

 

總結:對於頭文件相互包含的情況需要特別的小心,要保證在使用一個類或函數之前它已經聲明過。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved