0

こんにちは、この質問の仕方がわかりません。かなり調べてみたのですが、空っぽでした。そのため、これがすでに終わっている場合はお詫び申し上げます。初めての C++ プロジェクトに取り組んでいますが、とても楽しかったです。コードをコンパイルすると、再定義エラーが発生します。プロジェクトは、それぞれ独自のヘッダー ファイルと、すべてが使用する 1 つの共通ヘッダーを持つ 3 つのメイン ファイルで構成されます。他のファイルがこのクラスにアクセスできるようにしたいので、共通ヘッダーで宣言しました。ガードを書いたので、これでこのエラーを回避できると思いましたが、そうではなく、理由がわかりません。

問題の 2 つのヘッダー ファイルを次に示します。

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 の両方のガードによって、メニュー クラスの再定義が防止されると思いました。

4

2 に答える 2

1

投稿したコードから複数の定義エラーが発生する理由は明らかではありません。しかし、答えは簡単です。クラス メニューを 2 回定義しないでください。なぜそんなことをしたのか理解できません。どんなメリットがあると思いますか? common.h または menu.h に一度入れるだけでOKです。

「プロジェクトは、それぞれ独自のヘッダー ファイルと、それらすべてが使用する 1 つの共通ヘッダーを持つ 3 つのメイン ファイルで構成されている」と言うと、ヘッダー ファイルの役割について誤解しているようです。しかし、ヘッダー ファイルに含まれるものはすべて共通のコードです。それがヘッダーファイルの目的です。したがって、私の選択は、class menu を menu.h に配置してから、必要な場所に menu.h を含めることです。

于 2012-08-10T17:11:42.750 に答える
0

#define MENU_Hクラスを複数回定義する場合、common.h から(および も)が欠落しています。その部分#define MYLIB_Hだけでなく、毎回ガード全体が必要です。#ifndef MENU_H

また、メニュー クラスを再度定義する代わりに、#include "menu.h"、およびを使用する必要があり#include "mylib.h"ます。2 つのヘッダーの両方にもう一方のヘッダーが含まれていても、両方が最初にもう一方を定義する必要がある場合にのみ、エラーではありませんが、明らかにそうではありません。

PS: がある#elseので、代わりに

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

あなたは書ける:

#ifdef _WIN32
  // for windows
#else
  // for anything else
#endif
于 2012-08-10T18:02:38.317 に答える