在标头中声明对象

Declare object in header

本文关键字:声明 对象      更新时间:2023-10-16

如何在不初始化对象的情况下声明对象?

这是我的头文件

    #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。

着色器仅为标头,当我通过kaarez::graphics::Shader terrainShader("vertex.txt", "fragment.txt"); 在主方法中声明它时,它就可以工作

怎么了?

初始化构造函数成员初始化器列表中的成员变量,如下所示:

Renderer::Renderer() : m_terrainShader("vertex.txt", "fragment.txt") {
}

您需要在类初始值设定项列表中初始化m_terrainShader,因为它不是默认可构造的。

Renderer::Renderer() : m_terrainShader("vertex.txt", "fragment.txt"){}

必须这样做的原因是,当您输入构造函数的主体时,所有类成员都已初始化。由于m_terrainShader不能默认初始化,您必须显式初始化它。

这可能不是一个确切的答案(而且已经晚了很多年),但在C++11或更高版本中,您可以使用唯一指针(或共享指针)。

在标题do中:

unique_ptr<Treaderkaarez::graphics::Shader> m_terrainShader;

在代码中做

m_terrainShader.reset(new kaarez::graphics::Shader("vertex.txt", "fragment.txt"));

它比指针更安全,因为你不必担心删除它失败或在不分配它的情况下删除它。