【问题标题】:Declare object in header在标题中声明对象
【发布时间】:2015-11-18 16:34:19
【问题描述】:

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

这是我的头文件

    #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 是header-only,当我通过kaarez::graphics::Shader terrainShader("vertex.txt", "fragment.txt");在main 方法中声明它时它可以工作

怎么了?

【问题讨论】:

  • 您的问题有点无法解决,因为 C++ 区分大小写。没有Class 关键字并且shader.h 不是Shader.h
  • 显然我的 IDE/编译器对包含不区分大小写。没有改变任何东西。

标签: c++ class object header


【解决方案1】:

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

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

你必须这样做的原因是当你进入构造函数的主体时,所有的类成员都已经初始化了。由于m_terrainShader 无法默认初始化,因此您必须显式初始化它。

【讨论】:

  • 谢谢,但是有没有办法在Renderer构造函数中初始化Shader?这个解决方案很好atm,但将来我想在构造函数中初始化它有几个原因。
  • 如果Shader 不是默认可构造的,则不会。它是构造对象的首选方式,有时也是唯一的方式。 stackoverflow.com/questions/926752/…
  • 唯一的解决方案是重新初始化它吗?
  • @KaareZ 为什么需要重新初始化它?您可以直接在初始化列表中构造成员。你能告诉我你正在尝试做什么以及为什么列表初始化对你不起作用的例子吗?
  • 我希望能够选择使用哪个“vertex.txt”和“fragment.txt”。例如,通过在 Renderer 构造函数中加载设置文件。我也不喜欢这种风格,但这当然是第二要务。
【解决方案2】:

像这样初始化构造函数成员初始化器列表中的成员变量:

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

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多