2016-12-07 18 views
1

この同じエラーでいくつかの他のページを検索しましたが、自分のコードに問題が見つかりません。私が疲れていてC++に若干新しくなっているだけかもしれません。クラスC++の再定義 - Xcode

私は3つの派生クラスを持つ親クラスのshape.hを持っています。 rectangle.h、triangle.h、およびcircle.hです。親クラスは、3行目に「Shapeの再定義」というエラーを取得するクラスです。私の人生では、派生クラスから形状コンストラクタを呼び出す方法以外に、何が間違っているのか分かりません。お手伝いをしてください。必要な情報はもう私に教えてください。

Shape.h:
の#include < cmath>

class Shape 
{ 
public: 
    //constructors 
    Shape(); 
    Shape(float a); 
    Shape(float a, float b); 

    //Returns 
    float area(); 
    float perimeter(); 

protected: 
    float base; 
    float height; 
    float radius; 
}; 

Shape.cpp:
の#include "Shape.h"

//constructors 
Shape::Shape() 
{ 
    base = 0; 
    height = 0; 
    radius = 0; 
} 

Shape::Shape(float a) 
{ 
    radius = a; 
} 

Shape::Shape(float a, float b) 
{ 
    base = a; 
    height = b; 
} 

//returns 
float Shape::area() 
{ 
    return 0; 
} 

float Shape::perimeter() 
{ 
    return 0; 
} 

すべての派生クラスが異なる以外は同じですここではCircle.hです:
#include "Shape.h"

class Circle: public Shape 
{ 
public: 
    //constructors 
    Circle(); 
    Circle(float a); 

    //Returns 
    float area(); 
    float perimeter(); 

private: 

}; 

Circle.cpp:Circle.cppShape.h
の#include "Circle.h"

//constructors 
Circle::Circle():Shape() 
{ 

} 

Circle::Circle(float a):Shape(a) 
{ 

} 

//returns 
float Circle::area() 
{ 
    return (3.14 * pow(radius,2)); 
} 

float Circle::perimeter() 
{ 
    return (2 * 3.14 * radius); 
} 

答えて

1

間接的に二倍含まれており、原因がコンパイルエラーに言及しました。

ヘッダーにinclude guardを追加します。例えば。 Shape.hは次のようになります。

#ifndef SHAPE_H 
#define SHAPE_H 

// Put your Shape class here 

#endif 

他のアプローチは、あなたのコンパイラがサポートしていればShape.hのbegginingで#pragma onceを使用することです。

+1

ありがとうございます!しかし、好奇心の念から、正確に何がエラーになるのか分かりますか? – user6383357

+1

@ user6383357ガードのない 'Circle.cpp'では、' Shape.h'が間接的に2回インクルードされ、前述のコンパイルエラーが発生します。 – Nikita

+0

ありがとう、それは理にかなって、私はそれがそうであると思った。 – user6383357