2012-08-10 20 views
0

嗨,我不知道如何提出這個問題,我已經完成了相當多的工作,並且空着;所以我必須道歉,如果這已經過去了。我正在開發我的第一個C++項目,並且非常有趣。編譯我的代碼時出現重新定義錯誤。該項目由3個主文件組成,每個文件都有自己的頭文件和一個共同的頭文件。我希望我的其他文件能夠訪問這個類,所以我在公共頭文件中聲明瞭它。我寫在警衛中,所以我認爲這會避免這個錯誤,但它不會,我不明白爲什麼。普通頭文件中的外部類以及該類的頭文件

下面是兩個有問題的頭文件。

menu.h


#ifndef MENU_H 
#define MENU_H 
#include "common.h" 
class menu 
{ 
    int x, y, iterations, time; 
    void title(int maxX, int maxY); 
    void titleSplash(); 
    void fall(bool, int&, int, int); 

public: 
menu(); 
void init(); 
int score; 
void gameOver(int how); 
void mainMenu(); 



}; 



#endif 

COMMON.H


#ifndef COMMON_H 
#define COMMON_H 
    //things that all files need 
     #include <curses.h> 
     #include <string.h> 
     #include <cstring> 
     #include <cstdlib> //for debugging 
     #include <unistd.h> 
     #include <iostream> 


     //using namespace std; 

     #ifdef _WIN32//are we running windows? 

     #define _WIN32_WINNT 0x0600 
     #define CLOCK 2//only used for the opening animaitons repalaces clock 
     #define SLEEP(a) sleep(a);//in 1000s of a second 
     #include "WIN32.h" 
     #endif 

     #ifndef _WIN32 

     #define CLOCK 8 
     #define SLEEP(a) usleep(a * 1000);//in 1 000 000s of a second// replaces CLOCK 

     #endif 

     #define TIMER 17 //for about 60 times a second rounding up form 16.666666 

    #ifndef MAIN_H 
     #ifndef NON_MAIN_COMMON 
     #define NON_MAIN_COMMON 

     //common things that i dont want to put in each header file 




    #endif 

#endif 
//everything else if after here including everything common.cpp 
//------------------------------------------------------------------------------------------ 

//anything in myLib MUST be externed to avoid multiple definitions error 
#ifndef MYLIB_H 
extern void getStdScr(); 
extern int stdx, stdy, score; 
extern WINDOW * win; 
extern void ncursesInit(); 
extern void wrapper(); 
extern void newGame(); 
extern std::string keyPress(); 
extern void bclear(WINDOW * window); 
#endif 

#ifndef MENU_H 
class menu 
{ 
public: 
menu(); 
void init(); 
int score; 
void gameOver(int how); 
void mainMenu(); 
}; 
#endif 

//end of myLib 


#endif 
//EOCOMMON 

我認爲後衛同時在menu.h和COMMON.H將防止重新定義我菜單類。

+1

類不應該在COMMON.H。只在menu.h中。而externs只在mylib.h中。爲什麼他們是extern?那些不是全局變量 – Gir 2012-08-10 17:03:04

+0

無法重現。發佈一個最小的完整示例,否則我們將沒有機會。 – Beta 2012-08-10 17:15:46

+0

如果你在兩個不同的地方有相同的代碼,他們會*不同步。不要重複自己;這是編程最基本的規則之一。 – 2012-08-10 19:27:41

回答

1

這並不明顯,爲什麼你從發佈的代碼中獲得多個定義錯誤。但答案很簡單。不要兩次定義類菜單。我不明白你爲什麼這樣做。你認爲它有什麼好處?只需將它放在common.h或menu.h中,你就可以了。

當您說'項目由3個主文件組成,每個文件都有自己的頭文件和一個共同的頭文件時,您似乎對頭文件的作用存在誤解'。但是,頭文件中的所有內容都是通用代碼。這是頭文件的用途。所以我的選擇是將類菜單放在menu.h中,然後在需要的地方包含menu.h。

+0

謝謝你的迴應,我之所以有單獨的頭文件(或者至少爲什麼我認爲這是一個好主意)是因爲我只希望其他文件只能看到一些項目 – superxkooda 2012-08-10 17:58:25

+1

如果你不想要有些東西對另一個文件是可見的,那麼不要把它放在頭文件中。把一個類定義(比如說)放在cpp文件中是完全可以的,這是你想使用它的唯一地方。記住頭文件的*點*是在cpp文件之間共享的。 – jahhaj 2012-08-10 18:03:16

+0

這有助於很多我猜我一直在誤用頭文件或至少接近錯誤。我確實有這個項目在git它的https://github.com/superxkooda/Hello-the-game.git這是一個愚蠢的基於文本的遊戲,使用ncurses.I計劃使它沿着zork迷你線的某處遊戲在這裏和那裏拋出。再次感謝它有很大幫助。 – superxkooda 2012-08-10 21:41:52

0

如果您多次定義一個班級,則缺少您的common.h中的#define MENU_H(還有#define MYLIB_H),您每次都需要整個警衛,而不僅僅是#ifndef MENU_H部分。

此外,不應再次定義菜單類,您應該使用#include "menu.h"#include "mylib.h"。如果兩個header都包含另一個header,那麼這不是一個錯誤,只有當兩個header都需要先定義另一個時,但顯然並非如此。

PS:有一個#else,所以不是

#ifdef _WIN32 
    // for windows 
#endif 
#ifndef _WIN32 
    // for anything else 
#endif 

你可以寫:

#ifdef _WIN32 
    // for windows 
#else 
    // for anything else 
#endif 
+0

包括彼此的兩個頭幾乎總是一個壞主意。 – 2012-08-10 19:29:52

+0

我不知道你可以使用其他的,謝謝我現在已經實現了。 – superxkooda 2012-08-10 21:32:23