【问题标题】:Virtual method in constructor C++构造函数 C++ 中的虚方法
【发布时间】:2018-12-26 17:59:08
【问题描述】:

我有一个类Shader,在它的构造函数中有编译着色器、绑定属性然后链接着色器程序的语句。 问题是我希望子类具有不同的属性,但这必须在链接之前发生。虚拟方法在这里不起作用。我该怎么办?

Shader::Shader(const char* v, const char* f) {
    program = glCreateProgram();

    const char* vsrc = nullptr;
    const char* fsrc = nullptr;

    tls::readTextFile(std::ifstream(v, std::ios::binary), vsrc);
    tls::readTextFile(std::ifstream(f, std::ios::binary), fsrc);

    m_vertShader = compile(vsrc, GL_VERTEX_SHADER);
    m_fragShader = compile(fsrc, GL_FRAGMENT_SHADER);

    glAttachShader(program, m_vertShader);
    glAttachShader(program, m_fragShader);

    bindAttribs(); // it must happen before linking, in child class too.

    glLinkProgram(program);

    getUniforms();
    setUniforms();
}

和子类:

void BasicShader::bindAttribs() {
    bindAttribute(0, "pos");
    bindAttribute(2, "vt");
} // this method is not called

【问题讨论】:

  • 重新打开。问题是不是为什么虚函数没有按照人们预期的方式运行,这就是所谓的重复所解决的问题。问题是该怎么做。并不是说有一个很好的答案......
  • @Pete “并不是说有一个好的答案……” 没错。我可以想到一个 Factory Pattern

标签: c++ function shader virtual


【解决方案1】:

问题在于您的构造函数是单片的。将其拆分为“预烘焙”受保护构造函数和执行链接(也受保护)的“最终构造”辅助函数。这样您就可以自定义在构建期间但在链接之前发生的事情。

更通用的方法是工厂函数。

【讨论】:

    【解决方案2】:

    据我所知,这里有两个选项:

    1。将属性作为参数传递给构造函数

    Shader::Shader(const char* v, const char* f,
        const std::vector<std::pair<int, std::string>> &attrs)
        /* Or some simpler type with the same functionality */
    {
        ...
        for (auto &&attr : attrs)
            bindAttr(attr.first, attr.second);
        ...
    }
    

    2。将所有初始化从构造函数移到单独的方法中

    bool Shader::initialize(const char* v, const char* f)
    {
        // Here you actually can use virtual methods, yay!
        // ...and even report errors via return value (unless you were planning to use exceptions)
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2023-03-27
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2013-01-18
      • 2016-02-09
      相关资源
      最近更新 更多