web-dev-qa-db-ja.com

クラスエラーの再定義が発生するのはなぜですか?

コードダンプの謝罪:

gameObject.cpp:

#include "gameObject.h"
class gameObject
{
    private:
    int x;
    int y;
    public:
    gameObject()
    {
    x = 0;
    y = 0;
    }

    gameObject(int inx, int iny)
    {
        x = inx;
        y = iny;
    }

    ~gameObject()
    {
    //
    }
    int add()
    {
        return x+y;
    }
};

gameObject.h:

class gameObject
{
    private:
    int x;
    int y;
    public:
    gameObject();

    gameObject(int inx, int iny);
    ~gameObject();
    int add();
};

エラー:

||=== terrac, Debug ===|
C:\terrac\gameObject.cpp|4|error: redefinition of `class gameObject'|
C:\terrac\gameObject.h|3|error: previous definition of `class gameObject'|
||=== Build finished: 2 errors, 0 warnings ===|

何が悪いのかわかりません。助けて?

17
Dataflashsabot

最初の定義はヘッダーファイルによって翻訳単位にドラッグされるため、ヘッダーファイルでクラスを定義し、ヘッダーファイルを* .cppファイルに含めて、クラスを2回定義します。ただし、翻訳単位ごとに許可されるgameObjectクラス定義は1つだけです。

実際には、関数を実装するためだけにクラスをもう一度定義する必要はありません。次のような関数を実装します。

#include "gameObject.h"

gameObject::gameObject(int inx, int iny)
{
    x = inx;
    y = iny;
}

int gameObject::add()
{
    return x+y;
}

38
sellibitze

cppファイルの実装は次の形式である必要があります

gameObject::gameObject()
    {
    x = 0;
    y = 0;
    }
gameObject::gameObject(int inx, int iny)
    {
        x = inx;
        y = iny;
    }

gameObject::~gameObject()
    {
    //
    }
int gameObject::add()
    {
        return x+y;
    }

クラスgameObject {}定義ブロック内にない

9
frag

同じクラスを2回定義しているのはそのためです。

CPPファイルにメソッドを実装することが目的の場合は、次のようにします。

gameObject::gameObject()
{
    x = 0;
    y = 0;
}
gameObject::~gameObject()
{
    //
}
int gameObject::add()
{
        return x+y;
}
3
locka

ヘッダーファイルを追加する

#pragma once
1
Helperors

テンプレートに問題がある場合、または別の.cppファイルからクラスを呼び出している場合

ヘッダーファイルで「#pragma once」を使用してみてください。

1
Noel Shere

.hファイルは次のようにラップする必要があります。

#ifndef Included_NameModel_H

#define Included_NameModel_H

// Existing code goes here

#endif
1
zhangxiang

問題を解決するために、いくつかの#ifndef name #define name #endifプリプロセッサを含めます。問題は、すべてのプリプロセッサ(#include)でクラスを複数回再定義しているため、ヘッダーから関数に戻ってからヘッダーに戻ることです。

0
J.J.

class gameObjectファイルと.cppファイルの両方で.hを定義します。
それは再定義エラーを作成しています。

クラスを定義する必要があります、[〜#〜] once [〜#〜][〜#〜 ] one [〜#〜]場所。 (慣習では、定義は.hにあり、すべての実装は.cppにあります)

エラーメッセージのどの部分で問題が発生しましたか。

エラーの最初の部分は、クラスがgameObject.cppで再定義されたことを示しています
エラーの2番目の部分は、前の定義がgameObject.hにあることを示しています。

メッセージはどれほど明確になりますか?

0
abelenky