如何在不初始化对象的情况下声明它?
这是我的头文件
#include "shader.h"
Class Renderer {
private:
kaarez::graphics::Shader m_terrainShader;
};
还有我的源文件
#include "Renderer.h"
#include "Shader.h"
Renderer::Renderer() {
//Load terrain shader
m_terrainShader = kaarez::graphics::Shader("vertex.txt", "fragment.txt");
}
我收到错误,没有可用于 Shader 的合适的默认构造函数。
Shader 是仅标头的,当我通过
kaarez::graphics::Shader terrainShader("vertex.txt", "fragment.txt");
在 main 方法中声明它时它就可以工作
出了什么问题?
像这样初始化构造函数成员初始值设定项列表中的成员变量:
Renderer::Renderer() : m_terrainShader("vertex.txt", "fragment.txt") {
}
您需要在类
初始化列表中初始化
m_terrainShader
,因为它不是默认可构造的。
Renderer::Renderer() : m_terrainShader("vertex.txt", "fragment.txt"){}
您必须这样做的原因是,当您进入构造函数主体时,所有类成员都已初始化。由于
m_terrainShader
无法默认初始化,因此您必须显式初始化它。
这可能不是一个准确的答案(而且晚了很多年),但在 C++11 或更高版本中,您可以使用唯一指针(或共享指针)。
在标题中执行:
unique_ptr<kaarez::graphics::Shader> m_terrainShader;
并在代码中执行
m_terrainShader.reset(new kaarez::graphics::Shader("vertex.txt", "fragment.txt"));
它比指针更安全,因为你不必担心删除失败或者删除时没有赋值。