今天在看C++ Primer第7章,一個習題是要寫兩個類,一個是Screen類,一個Window_mgr類,其中,Window_mgr類包含有一個vector
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: vectorscreens; }; #endif
main.cc
#include Window_mgr.h #include Screen.h int main() { ........ return 0; }
原因如下:
按照上面的寫法,在編譯前,main.cc文件會變成如下:
#define WINDOW_MGR_H #define SCREEN_H class Screen { friend void Window_mgr::clear(); …….. }; class Window_mgr { public: void clear(); …….. private: vectorscreens; };
所以,應該在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
總結:對於頭文件相互包含的情況需要特別的小心,要保證在使用一個類或函數之前它已經聲明過。