gpt4 book ai didi

c++ - 难以理解在头类声明中发现的这种模式在做什么(C++,OpenGL)

转载 作者:行者123 更新时间:2023-12-01 14:42:14 24 4
gpt4 key购买 nike

我对 C++ 相当缺乏经验,我一直在我试图学习的代码库中的图形库包装器的头文件中看到这种模式;有人可以向我解释一下“公共(public)”部分的前八行在做什么吗?
完整代码:

#pragma once

#include <glad/glad.h>
#include "textures.h"

namespace gl {
class Framebuffer final {
public:
Framebuffer();
~Framebuffer();

Framebuffer(Framebuffer&& other);
Framebuffer& operator=(Framebuffer&& other);

Framebuffer(const Framebuffer&) = delete;
Framebuffer& operator=(const Framebuffer&) = delete;

void create(unsigned int width, unsigned int height);
void destroy();

void bind() const;

void bindTexture() const;

private:
void reset();

Texture2d m_texture;
GLuint m_handle = 0;
GLuint m_renderbufferHandle = 0;

unsigned m_width = 0;
unsigned m_height = 0;
};

void unbindFramebuffers(unsigned windowWidth, unsigned windowHeight);
}
我很好奇的台词:
namespace gl {
class Framebuffer final {
public:
Framebuffer();
~Framebuffer();

Framebuffer(Framebuffer&& other);
Framebuffer& operator=(Framebuffer&& other);

Framebuffer(const Framebuffer&) = delete;
Framebuffer& operator=(const Framebuffer&) = delete;
包括这些行会导致我的构建失败并出现 Unresolved external symbol 错误,但是删除它们也会导致构建失败,因为不同的未解决符号原因。我假设它试图在“gl”命名空间中添加、覆盖或扩展某些东西?但我不确定它试图完成的具体内容是什么。

最佳答案

这些是类(class)的特殊成员。让我们来看看,

Framebuffer();
这是一个默认构造函数,它创建一个没有任何参数的对象。实际上,它是由编译器编写的,带有一个成员初始值设定项列表。
Framebuffer() : m_handle{0}, m_renderbufferHandle{0}, m_width{0}, m_height{0} {};
如果 m_texture 变量没有任何来自 Texture2D 的初始值,该初始值将以垃圾值开头。
下一个功能是
~Framebuffer();
它被称为析构函数。它负责终止初始化的变量。例如,您已经通过 malloc 函数分配了内存。当从 Framebuffer 类创建的实例时,它需要释放该内存以避免内存泄漏。
接下来的两个是移动语义。第一个是移动构造函数,另一个是移动赋值。
Framebuffer(Framebuffer&& other);
Framebuffer& operator=(Framebuffer&& other);
那么,什么是移动语义?它窃取对象的资源,这是一个生命周期。你可以认为有一个对象,它将被终止,但你想使用它们的值。您无需处理其变量,而是占用其内存位置等。例如,您创建了一个临时对象,例如;
Framebuffer fm = Framebuffer{};
在此代码中将调用移动构造函数。要调用移动任务,您需要编写类似的内容;
Framebuffer fm;
fm = Framebuffer{};
这是移动分配。
另外两个是复制语义,但是已经被删除了。
Framebuffer(const Framebuffer&) = delete;
Framebuffer& operator=(const Framebuffer&) = delete;
因此,如果您编写调用复制特殊成员的代码,编译器将引发语法错误。因此,你不能这样写;
Framebuffer fm;
Framebuffer myfm;
Framebuffer dummyfm{fm}; // syntax error
fm = myfm; // syntax error
它复制对象的所有变量。此外,如果有内存分配,它会分配新内存并从其他对象复制。请参阅详细的解释检查;
https://en.cppreference.com/w/cpp/language/classes
此外,您可以观看 Howard Hinnant 的演示;
https://www.youtube.com/watch?v=vLinb2fgkHk

关于c++ - 难以理解在头类声明中发现的这种模式在做什么(C++,OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63519471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com