我正在用 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;
};
我知道可以先放到堆上,稍后再解构,但是我懒得放到堆上。
另一个问题:我想知道我的引擎是否正确制造以及设计是否正确。
如果您的问题是“如何在不初始化 X 的情况下声明 X”,那么您可以简单地将
Shader shader
作为 Engine 类中任何位置的成员。虽然我怀疑您问的是更复杂的问题,但请详细说明。