我有兩個類:MazeClass和CreatureClass,它們使用一個名爲「座標」的結構,我如何能夠跨兩個類使用結構? 我試圖把結構中的兩次,我得到:C++:跨類結構
MazeClass.h:16:8: error: redefinition of ‘struct coordinate’
CreatureClass.h:11:18: error: previous definition of ‘struct coordinate’
我有兩個類:MazeClass和CreatureClass,它們使用一個名爲「座標」的結構,我如何能夠跨兩個類使用結構? 我試圖把結構中的兩次,我得到:C++:跨類結構
MazeClass.h:16:8: error: redefinition of ‘struct coordinate’
CreatureClass.h:11:18: error: previous definition of ‘struct coordinate’
你可以在公共的一個類中聲明結構體。選擇類更相關:
class MazeClass
{
public:
struct coordinate {} ;
} ;
其他類可以訪問此類型MazeClass::coordinate
。或者你可以帶一個typedef。
class CreatureClass
{
public:
typedef MazeClass::coordinate coordinate ;
} ;
你需要把的struct coordinate
定義在一個共同的位置,而不是重複它。也許創建一個新的coordinate.h
文件?不要忘記使用包括守衛。
您應該只在整個頭文件中定義一次結構。將coordinates
移動到它自己的頭文件(帶有一個包含保護)中,然後將這個頭包含在你的其他頭文件中。
例coordinates.h
:
#ifndef COORDINATES_H
#define COORDINATES_H
struct coordinates {
// ...
};
#endif
從技術上講,這是確定的兩個頭定義coordinates
(儘管從維護的角度可怕的 - 保持DRY!)。當另一個頭文件或實現文件同時包含這兩個頭文件(直接或間接)時,會出現問題 - 然後編譯器會看到兩個不同的結構體定義(它不知道它們是相同的),並且抱怨錯誤已發佈。
在代數中,這被稱爲「因式分解」的共同因素。
創建一個「coordinate.h」文件。在它裏面,使用include guard,放置你的座標結構的定義。
然後在MazeClass.h和CreatureClass.h中使用#include "coordinate.h"
。
你能發表你的代碼嗎? – 2011-03-21 01:12:49
讓我們來看看頭文件,特別是如何聲明類和座標 – Mark 2011-03-21 01:13:29
這兩個結構都是相同的嗎?大多數答案都假設它們是,但是你可以很容易地在兩種不同類型之間產生命名衝突。 – 2011-03-21 01:45:47