构造函数在退出函数时无法初始化一个参数

Constructor cannot Initialize one parameter when it exits the function

本文关键字:参数 一个 初始化 退出 函数 构造函数      更新时间:2023-10-16

我的C++代码有一个问题。我正在使用Assimp库,并且我有一个类,它有一个类型为const aiScene*的属性。在类的构造函数中,我分配这个值,一切都很好,但当我退出构造函数代码时,参数const aiScene*没有分配任何数据

我把代码贴在这里。

型号.h

class Model
{
public:
Model(std::string objectLoc, std::string vertexLoc, std::string fragmentLoc,
glm::vec3 position, glm::vec3 scale, glm::vec3 rotation,
Camera* camera);
void render();
~Model();
private:
std::string objectLoc, vertexLoc, fragmentLoc;
Shader* shader;
glm::mat4 model;
glm::vec3 position, scale, rotation;
Camera* camera;
std::vector<Mesh*> meshes;
std::vector<Texture*> textures;
std::vector<unsigned int> meshToTex;
std::unordered_map<std::string, GLuint> boneMapping;
std::vector<glm::mat4> bonesTransformations;
const aiScene* scene;
glm::mat4 globalInverseTransform;
GLuint boneCount;
};

型号.cpp

Model::Model(std::string objectLoc, std::string vertexLoc, std::string fragmentLoc, glm::vec3 
position, glm::vec3 scale, glm::vec3 rotation, Camera* camera)
: objectLoc(objectLoc), vertexLoc(vertexLoc), fragmentLoc(fragmentLoc),
position(position), scale(scale), rotation(rotation),
camera(camera),
boneCount(0)
{
shader = new Shader(vertexLoc, fragmentLoc,
DirectionalLight(glm::vec3(1.0f, 1.0f, 1.0f), 0.4f, 0.1f, glm::vec3(0.0f, 0.0f, -1.0f)),
SpecularLight(1.0f, 250.0f),
SpotLight(glm::vec3(1.0f, 1.0f, 1.0f), 0.0f, 1.0f, glm::vec3(0.0f, 0.0f, 0.0f), 1.0f, 0.0f, 0.0f, 
glm::vec3(0.0f, 0.0f, -1.0f), glm::radians(10.0f)));
shader->addPointLight(PointLight(glm::vec3(1.0f, 0.0f, 0.0f), 0.2f, 0.2f, glm::vec3(0.0f, 0.0f, 
-15.0f), 0.3f, 0.2f, 0.1f));
shader->addPointLight(PointLight(glm::vec3(0.0f, 1.0f, 0.0f), 0.2f, 0.2f, glm::vec3(10.0f, 0.0f, 
-15.0f), 0.3f, 0.2f, 0.1f));
shader->addPointLight(PointLight(glm::vec3(0.0f, 0.0f, 1.0f), 0.2f, 1.2f, glm::vec3(-10.0f, 0.0f, 
-15.0f), 0.8f, 0.2f, 0.1f));
model = glm::translate(glm::mat4(1.0f), position)
* glm::scale(glm::mat4(1.0f), scale)
* glm::rotate(glm::mat4(1.0f), glm::radians(rotation.x), glm::vec3(1, 0, 0))
* glm::rotate(glm::mat4(1.0f), glm::radians(rotation.y), glm::vec3(0, 1, 0))
* glm::rotate(glm::mat4(1.0f), glm::radians(rotation.z), glm::vec3(0, 0, 1));
Assimp::Importer importer;
scene = importer.ReadFile(objectLoc,
aiProcess_Triangulate |
aiProcess_FlipUVs |
aiProcess_GenSmoothNormals |
aiProcess_JoinIdenticalVertices);
if (!scene)
{
printf("Cannot load model %s: %sn", objectLoc.c_str(), importer.GetErrorString());
return;
}
aiNode* rootNode = scene->mRootNode;
globalInverseTransform = aiMatrix4x4ToGlm(rootNode->mTransformation.Inverse());
loadNode(rootNode);
loadTextures();
}

我已经尝试了一切,从一个接一个地复制属性到对象场景,到在所有涉及的类中创建克隆方法,但都没有。甚至,我认为问题可能是场景属性中的const标识符,但如果我使对象不恒定,它的工作方式就会错误地相同。

我不会在Model类的任何方法中修改该属性。

我把这个问题的一些照片贴在这里。

在构造函数中取得好成绩

构造函数的错误结果

如果你能帮助我,那就太好了。

文档显示

返回的数据是只读的,导入器对象保留数据的所有权,并将在销毁时销毁数据。

[Assimp::Importer::ReadFile]

当构造函数被留下时,Assimp::Importer importer;scene所指向的对象被销毁。

在你离开构造函数或之前,你必须复制它

使用GetOrphanedScene()获取其所有权。

[Assimp::Importer::ReadFile]

aiScene* Assimp::Importer::GetOrphanedScene ( )
返回上次成功调用ReadFile((时加载的场景,并从Importer实例的所有权中释放该场景。

应用程序现在负责删除场景。对GetScene((或GetOrphanedScene((的任何进一步调用都将返回NULL,直到通过ReadFile((加载了新场景为止。

退货:当前场景或NULL(如果当前没有加载的场景(

注:使用这种方法时要格外小心,而且只有在必要的时候。根据设计,aiScene的只由Assimp维护、分配和释放,而不是其他人。这背后的原因是黄金法则,即释放应该始终由进行原始分配的模块完成,因为堆不一定是共享的。GetOrphanedScene((强制您自己删除返回的场景,但只有当您使用与assimp相同的堆时,这才可以。在Windows上,只要所有内容都链接到运行库的多线程dll版本,这通常是可以的。它也适用于与Assimp的静态链接。

[Assimp::Importer::GetOrphanedScene]

相关文章: