2011-03-21 122 views
2

我有兩個類:MazeClass和CreatureClass,它們使用一個名爲「座標」的結構,我如何能夠跨兩個類使用結構? 我試圖把結構中的兩次,我得到:C++:跨類結構

MazeClass.h:16:8: error: redefinition of ‘struct coordinate’

CreatureClass.h:11:18: error: previous definition of ‘struct coordinate’

+1

你能發表你的代碼嗎? – 2011-03-21 01:12:49

+0

讓我們來看看頭文件,特別是如何聲明類和座標 – Mark 2011-03-21 01:13:29

+0

這兩個結構都是相同的嗎?大多數答案都假設它們是,但是你可以很容易地在兩種不同類型之間產生命名衝突。 – 2011-03-21 01:45:47

回答

2

你可以在公共的一個類中聲明結構體。選擇類更相關:

class MazeClass 
{ 
public: 
    struct coordinate {} ; 
} ; 

其他類可以訪問此類型MazeClass::coordinate。或者你可以帶一個typedef。

class CreatureClass 
{ 
public: 
    typedef MazeClass::coordinate coordinate ; 
} ; 
0

你需要把的struct coordinate定義在一個共同的位置,而不是重複它。也許創建一個新的coordinate.h文件?不要忘記使用包括守衛。

5

您應該只在整個頭文件中定義一次結構。將coordinates移動到它自己的頭文件(帶有一個包含保護)中,然後將這個頭包含在你的其他頭文件中。

coordinates.h

#ifndef COORDINATES_H 
#define COORDINATES_H 

struct coordinates { 
    // ... 
}; 

#endif 

從技術上講,這是確定的兩個頭定義coordinates(儘管從維護的角度可怕的 - 保持DRY!)。當另一個頭文件或實現文件同時包含這兩個頭文件(直接或間接)時,會出現問題 - 然後編譯器會看到兩個不同的結構體定義(它不知道它們是相同的),並且抱怨錯誤已發佈。

0

在代數中,這被稱爲「因式分解」的共同因素。

創建一個「coordinate.h」文件。在它裏面,使用include guard,放置你的座標結構的定義。

然後在MazeClass.h和CreatureClass.h中使用#include "coordinate.h"