错误C2084“已经有身体”应该编译?

时间:2015-08-30 09:23:20

标签: c++ inheritance compilation

我在编译时收到以下错误消息:

mathsphere.cpp(10): error C2084: function 'MathSphere::MathSphere(const Vec3f &,const float &,Shader *)' 

already has a body mathsphere.h(17) : see previous definition of '{ctor}'

mathsphere.cpp(10): error C2512: 'VisualObject' : no appropriate default constructor available

我的代码如下:

MathSphere.cpp

#include "MathSphere.h"

MathSphere::MathSphere(const Vec3f &c, const float &r, Shader* shadName) {
    radius = r;
    radiusSquared = (r * r);
}

MathSphere.h

#ifndef MathSphere_h
#define MathSphere_h

#include "Vec3.h"
#include "VisualObject.h"

class MathSphere : public VisualObject {
public:
    Vec3f center;
    float radius, radiusSquared;
    Vec3f surfaceColor, emissionColor;

    Vec3f getNormal(const Vec3f &pHit) const;
    bool intersect(const Vec3f &rayOrigin, const Vec3f &rayDir, float &t0, float &t1) const;
    MathSphere(const Vec3f &c, const float &r, Shader* shadName) : VisualObject(c, shadName){}
};

#endif 

VisualObject.cpp

    #include "VisualObject.h"

VisualObject::VisualObject(const Vec3f &pos, Shader* shaderName) {
    shader = shaderName;
}

Shader* VisualObject::getShader() {
    return shader;
}

VisualObject.h

#ifndef VisualObject_h
#define VisualObject_h

#include "Object.h"

class VisualObject : public Object {
public:
    Shader * shader;

    Shader* getShader();
    VisualObject(const Vec3f &pos, Shader* shaderName) : Object(pos) {}
    ~VisualObject();
    virtual bool intersect(const Vec3f &rayOrigin, const Vec3f &rayDir, float &t0, float &t1) const;
    virtual Vec3f getNormal(const Vec3f &pHit) const;

};

#endif

2 个答案:

答案 0 :(得分:0)

.h中使用该行,您为构造函数提供了一个正文。

MathSphere(const Vec3f &c, const float &r, Shader* shadName) : VisualObject(c, shadName){}
                                                                                        ^^

所以要么在你的.h文件或源文件中合并两个。

这也应该删除过程中的第二个错误,因为在你的标题中你实际上给了VisualObject构造函数的参数,但是没有在源文件中,所以假设默认的一个,并且当你没有有任何,它吐出错误。

答案 1 :(得分:0)

在C ++中,有声明和定义:

  • 声明是关于引入名称和一些最小信息
  • 定义是关于定义超出名称的内容。

声明可以重复(只要它们始终相同),但定义通常只出现一次。如果提供了多个定义,那么编译器会选择哪一个?

所以,有了这个背景:

// MathSphere.h
    MathSphere(const Vec3f &c, const float &r, Shader* shadName):
        VisualObject(c, shadName){}

// MathSphere.cpp
MathSphere::MathSphere(const Vec3f &c, const float &r, Shader* shadName)
{
    radius = r;
    radiusSquared = (r * r);
}

这些都是定义!

您有两种解决方案:

  • 单一定义,直接在" .h" (如果你在课堂上这样做,那没关系)
  • " .h"中的声明和#34; .cpp"
  • 中的定义

由于后者更新,所以它的工作原理如下:

// MathSphere.h
    MathSphere(const Vec3f &c, const float &r, Shader* shadName);

// MathSphere.cpp
MathSphere::MathSphere(const Vec3f &c, const float &r, Shader* shadName):
    VisualObject(c, shadName)
{
    radius = r;
    radiusSquared = (r * r);
}

虽然,对于奖励积分,您应该初始化构造函数的初始化列表中的属性:

MathSphere::MathSphere(const Vec3f &c, const float &r, Shader* shadName):
    VisualObject(c, shadName), radius(r), radiusSquared(r*r)
{
}