在标头中声明对象

问题描述 投票:0回答:3

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

这是我的头文件

    #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 方法中声明它时它就可以工作

出了什么问题?

c++ class object header
3个回答
3
投票

像这样初始化构造函数成员初始值设定项列表中的成员变量:

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

2
投票

您需要在类

初始化列表
中初始化m_terrainShader,因为它不是默认可构造的。

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

您必须这样做的原因是,当您进入构造函数主体时,所有类成员都已初始化。由于

m_terrainShader
无法默认初始化,因此您必须显式初始化它。


1
投票

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

在标题中执行:

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

并在代码中执行

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

它比指针更安全,因为你不必担心删除失败或者删除时没有赋值。

© www.soinside.com 2019 - 2024. All rights reserved.