c++ 在标题中声明对象

r7knjye2  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(148)

我如何声明一个对象而不初始化它?
这是我的头文件

#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是只包含头文件的,当我在main方法中通过kaarez::graphics::Shader terrainShader("vertex.txt", "fragment.txt");声明它时,它可以工作
怎么了?

2fjabf4q

2fjabf4q1#

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

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

yc0p9oo02#

您需要在类initializer list中初始化m_terrainShader,因为它不是默认可构造的。

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

你必须这样做的原因是当你进入构造函数的主体时,所有的类成员都已经初始化了,因为m_terrainShader不能被默认初始化,你必须显式地初始化它。

r6vfmomb

r6vfmomb3#

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

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

在代码中

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

它比指针更安全,因为您不必担心删除它失败或删除它而不对其赋值。

相关问题