今天在看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:
vector screens;
};
#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:
vector screens;
};
所以,應該在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
總結:對於頭文件相互包含的情況需要特別的小心,要保證在使用一個類或函數之前它已經聲明過。