我在一个工作正常但现在似乎根本不想工作的课上遇到了一些麻烦。
错误为"No appropriate default constructor available"
我在两个地方使用该类我正在制作它们的列表并初始化然后将它们添加到列表中。
Vertice3f.h
#pragma once
#include "Vector3f.h"
// Vertice3f hold 3 floats for an xyz position and 3 Vector3f's
// (which each contain 3 floats) for uv, normal and color
class Vertice3f{
private:
float x,y,z;
Vector3f uv, normal, color;
public:
// If you don't want to use a UV, Normal or Color
// just pass in a Verctor3f with 0,0,0 values
Vertice3f(float _x, float _y, float _z, Vector3f _uv,
Vector3f _normal, Vector3f _color);
~Vertice3f();
};
Vertice3f.cpp
#include "Vertice3f.h"
Vertice3f::Vertice3f(float _x, float _y, float _z,
Vector3f _uv, Vector3f _normal, Vector3f _color){
x = _x;
y = _y;
z = _z;
uv = _uv;
normal = _normal;
color = _color;
}
正在我的OBJModelLoader类中使用如下:
list<Vertice3f> vert3fList;
Vertice3f tvert = Vertice3f(
x = (float)atof(
vertList[i].substr(
vertList[i].find("v") + 1,
vertList[i].find(" ", vertList[i].find("v") + 2, 10)
).c_str()
),
y = (float)atof(
vertList[i].substr(
vertList[i].find(" ", vertList[i].find("v") + 4, 10) + 1,
vertList[i].find(" ", vertList[i].find("v") + 13, 10)
).c_str()
),
z = (float)atof(
vertList[i].substr(
vertList[i].find(" ", vertList[i].find("v") + 13, 10) + 1,
vertList[i].find(" ", vertList[i].find("v") + 23, 10)
).c_str()
),
::Vector3f(0.0f,0.0f,0.0f),::Vector3f(0.0f,0.0f,0.0f),::Vector3f(0.0f,0.0f,0.0f)
);
vert3fList.push_back(
tvert
);
我自己尝试定义一个默认构造函数,所以在.h中我把
Vertice3f();
和cpp
Vertice3f::Vertice3f(){
x = 0.0f;
y = 0.0f;
z = 0.0f;
uv = Vector3f(0.0f,0.0f,0.0f);
normal = Vector3f(0.0f,0.0f,0.0f);
color = Vector3f(0.0f,0.0f,0.0f);
}
所以,我不确定为什么它找不到默认构造函数或者如何安抚编译器。我确定这是用户错误,因为编译器可能知道它在做什么。 非常感谢任何帮助,我会回答你的任何其他问题,只是问。
答案 0 :(得分:2)
我猜测缺少的默认构造函数是Vector3f
类的默认构造函数,而不是Vertice3f
类的默认构造函数。 Vertice3f
的构造函数尝试默认构造其Vector3f
成员,这会导致错误。
这就是为什么您为Vertice3f
提供默认构造函数的尝试不会改变任何内容的原因。问题在于Vector3f
。
要修复它,要么提供所有必要的默认构造函数(假设它与您的设计一致),要么使用初始化列表而不是体内赋值重写Vertice3f
的构造函数
Vertice3f::Vertice3f(float _x, float _y, float _z,
Vector3f _uv, Vector3f _normal, Vector3f _color) :
x(_x), y(_y), z(_z), uv(_uv), normal(_normal), color(_color)
{}
此版本不再尝试默认构造任何内容。在任何情况下,使用初始化列表而不是体内分配都是一个好主意。