如何在c++中的成员函数中初始化成员类

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

我正在用 C++ 制作一个小型 OpenGl 引擎。我有一个 Engine 类,它有一个窗口成员(在 init 列表中初始化)、一个着色器成员和一个潜在的渲染器类。如何在不初始化着色器程序的情况下声明它?

class Engine {
public:
    Window win;

public:
    Engine(ushort width = 600, ushort height = 800, const char* n = "Test Engine");
    void run();


    inline void setUpdateFunction(const std::function<void(float)>& func)
    { updateFunc = func; }

private:
    std::function<void(float)> updateFunc;
    bool running = true;
};
class Shader {
public:
    Shader(const char* vertPath, const char* fragPath);
    inline ~Shader() { glDeleteProgram(shaderProgram); }
    inline void use() { if (shaderProgram != 0) glUseProgram(shaderProgram); }
    inline void close() { glUseProgram(0); }

private:
    enum ShaderType {
        DRM_VERTEX_SHADER,
        DRM_FRAGMENT_SHADER,
        DRM_PROGRAM,
    };

private:
    uint32_t shaderProgram;
    void check(uint32_t shader, ShaderType type);

};
class Window {
public:
    Window(uint16_t w = 600, uint16_t h = 800, const char* name = "Test Window");
    ~Window();
    void mouseToggle();
    void setCursorPosCallback(GLFWcursorposfun callback);
    void setResizeCallback(GLFWframebuffersizefun callback);

    bool shouldClose() { return glfwWindowShouldClose(window); }
    void swapBuff() { glfwSwapBuffers(window); }

private:
    static inline void resizeCallback(DRMwindow window, int width, int height)
    { glViewport(0, 0, width, height); }

private:
    uint16_t width, height;
    const char* windowName;
    bool mouseShow = true;
    DRMwindow window;
};

我知道可以先放到堆上,稍后再解构,但是我懒得放到堆上。

另一个问题:我想知道我的引擎是否正确制造以及设计是否正确。

c++ oop opengl architecture
1个回答
0
投票

如果您的问题是“如何在不初始化 X 的情况下声明 X”,那么您可以简单地将

Shader shader
作为 Engine 类中任何位置的成员。虽然我怀疑您问的是更复杂的问题,但请详细说明。

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