1. ホーム
  2. c++

[解決済み] エラー: クラスの再定義

2022-02-02 12:45:58

質問

以下は私のコードです。

// in main.cpp

#include "iostream"
#include "circle.cpp"
#include "rectangle.cpp"
#include "shape.cpp"

using namespace std;

int main() {
    Shape shapes[10];

    for (int i = 0; i < 10; i++){
        if (i % 2)
            shapes[i] = Circle(5);
        else
            shapes[i] = Rectangle(10, 10);

        cout << shapes[i].getArea();
    }

    return 0;
}


// in circle.cpp

#include "shape.cpp"

class Circle : public Shape {
    private:
        int radius;
        static const double PI = 3.14159265358979323846;

    public:
        Circle (int radius) : radius(radius) {}

        virtual int getArea() const {
            return PI * radius*radius;
        };

        virtual int setRadius(int radius){
            radius = radius;
        }
};


// in rectangle.cpp

#include "shape.cpp"

class Rectangle : public Shape {
    private:
        int width;
        int height;

    public:
        Rectangle(int width, int height) : width(width), height(height){}

        virtual int getArea() const {
            return width * height;
        }

        virtual void setWidth(int width){
            this->width = width;
        }

        virtual void setHeigth(int height){
            this->height = height;
        }
};


// in shape.cpp

class Shape {
    public:
        virtual int getArea() const = 0;
};

コンパイルすると、こんなエラーが出ます。

error: redefinition of 'class Shape'

どうすれば直るのでしょうか?

どのように解決するのですか?

.h(ヘッダー)と.cppファイル(実装)の間でコードを構成する必要があります。

ヘッダーファイルはインクルードする必要があります。 .h 絶対に .cpp ファイルを作成します。(あなたが何をするか知っているのでなければ、そしてそれは本当にまれなケースでしょう)。

そうしないと、クラスを何度もコンパイルすることになり、コンパイラが言うようなエラーになります。クラスの再定義...」というエラーが出ます。

このエラーに対する追加の防御策は インクルードガード またはヘッダーガードを使用します。

ほとんどのコンパイラは、次のようなものをサポートしています。 #pragma once の一番上に書くことです。 .h ファイルを作成し、一度だけコンパイルされるようにします。

もし、お使いのコンパイラーでプラグマが利用できない場合は、伝統的なインクルード/ヘッダーガードシステムを利用することができます。

#ifndef MYHEADEFILE_H
#define MYHEADEFILE_H

// content of the header file

#endif