1. 程式人生 > >C++型別重定義錯誤的解決方法

C++型別重定義錯誤的解決方法

當我們想在.h宣告中定義成員變數,有時會報型別重定義錯誤,如果不是工程中真的重複定義了多個同名類,那麼多半是沒有給該類的標頭檔案加條件指示符#ifndef,條件指示符#ifndef 最主要的目的就是防止標頭檔案的重複包含和編譯,這樣才能保證標頭檔案被多個其他檔案引用時,內部的資料不會被多次定義而造成錯誤。解決方法有兩種:

方法一:在報型別重定義的類的標頭檔案,最上方加兩行:

#ifndef XXXX_H
#define XXXX_H

    最下方加一行:

#endif //XXXX_H

    (XXXX_H是xxxx.h的大寫形式)

    在生成一下,重定義的錯誤就不見了。

方法二:有的時候就是忘記加方法一種的條件指示符,還不想報錯,該怎麼辦呢,可以在宣告該成員變數的標頭檔案中不去#include該類,而是定義一個同名類class XXXX;然後宣告一個指標XXXX *m_pXxxx;接著,在.cpp檔案中#include該類,然後new一個該型別的指標m_pXxxx=new XXXX();接下來直接使用m_pXxxx即可,這時有沒有方法一中的條件指示符都不會報錯了。

    例如:在GoScanClass.h中定義的一個類GoScan,想在depthview.cpp中使用,如何在depthview.h中宣告成員,在depthview.cpp中定義變數呢?如下:

/*depthview.h*/

//#include "GoScanClass.h"
class GoScan;
......
public:
	GoScan *m_pScanValue;

/*depthview.cpp*/

#include "GoScanClass.h"
DepthView::DepthView(QWidget *parent)
	:QWidget(parent)
{
m_pScanValue = new GoScan();
m_pScanValue->OpenAndStart();//OpenAndStart()是GoScan類的一個方法

......
}
DepthView::~DepthView()
{
	delete m_pScanValue;
	m_pScanValue = NULL;
}