我在编译时收到以下错误消息:
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
答案 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);
}
这些都是定义!
您有两种解决方案:
由于后者更新,所以它的工作原理如下:
// 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)
{
}