C++ 08 之 const连接属性.cpp

c08 const连接属性.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>   
using namespace std;

int main(void)
{
	// c++中const修饰全局变量,默认是内部链接属性
	extern const int global_b;	// 声明要使用其他文件中的那个全局变量  本文件和外部文件都要加上extern才生效
	printf("global_b:%d\n",global_b);
	return EXIT_SUCCESS;
}

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2039 "vector": 不是 "std" 的成员 SolarSystem E:\C++\SolarSystem\main.cpp 96 错误 C3668 “Background::render”: 包含重写说明符“override”的方法没有重写任何基类方法 SolarSystem E:\C++\SolarSystem\Background.h 11 错误 C3668 “Background::render”: 包含重写说明符“override”的方法没有重写任何基类方法 SolarSystem E:\C++\SolarSystem\Background.h 11 错误 C3861 “getInstance”: 找不到标识符 SolarSystem E:\C++\SolarSystem\main.cpp 75 错误 C3861 “getInstance”: 找不到标识符 SolarSystem E:\C++\SolarSystem\Object.cpp 12 错误 C3861 “getInstance”: 找不到标识符 SolarSystem E:\C++\SolarSystem\Object.cpp 36 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 96 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 97 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 98 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 99 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 100 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 101 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 102 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 103 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 104 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 106 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 127 错误 C2065 “planets”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 136 错误 C2530 “p”: 必须初始化引用 SolarSystem E:\C++\SolarSystem\main.cpp 106 错误 C2530 “p”: 必须初始化引用 SolarSystem E:\C++\SolarSystem\main.cpp 127 错误 C2530 “p”: 必须初始化引用 SolarSystem E:\C++\SolarSystem\main.cpp 136 错误 C3531 “p”: 类型包含“auto”的符号必须具有初始值设定项 SolarSystem E:\C++\SolarSystem\main.cpp 106 错误 C3531 “p”: 类型包含“auto”的符号必须具有初始值设定项 SolarSystem E:\C++\SolarSystem\main.cpp 127 错误 C3531 “p”: 类型包含“auto”的符号必须具有初始值设定项 SolarSystem E:\C++\SolarSystem\main.cpp 136 错误 C2653 “Sphere”: 不是类或命名空间名称 SolarSystem E:\C++\SolarSystem\Background.cpp 10 错误 C2275 “std::unique_ptr<Planet,std::default_delete<Planet>>”: 应为表达式而不是类型 SolarSystem E:\C++\SolarSystem\main.cpp 96 错误 C2653 “TexturePool”: 不是类或命名空间名称 SolarSystem E:\C++\SolarSystem\main.cpp 75 错误 C2653 “TexturePool”: 不是类或命名空间名称 SolarSystem E:\C++\SolarSystem\Object.cpp 12 错误 C2653 “TexturePool”: 不是类或命名空间名称 SolarSystem E:\C++\SolarSystem\Object.cpp 36 错误 C2065 “TexturePool”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 75 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 75 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 76 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 77 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 78 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 79 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 80 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 81 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 82 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 83 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 84 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 85 错误 C2065 “tp”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 86 错误 C2065 “vector”: 未声明的标识符 SolarSystem E:\C++\SolarSystem\main.cpp 96 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 81 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 82 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 83 错误 C2143 语法错误: 缺少“;”(在“)”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 106 错误 C2143 语法错误: 缺少“;”(在“)”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 127 错误 C2143 语法错误: 缺少“;”(在“)”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 136 错误 C2143 语法错误: 缺少“;”(在“:”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 106 错误 C2143 语法错误: 缺少“;”(在“:”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 127 错误 C2143 语法错误: 缺少“;”(在“:”的前面) SolarSystem E:\C++\SolarSystem\main.cpp 136
最新发布
11-30
# 题目重述 你正在编译一个基于 OpenGL 的太阳系模拟项目,遇到大量新的编译错误,主要包括: - `std::vector` 和 `std::unique_ptr` 未识别; - `TexturePool::getInstance()` 找不到; - `Background::render` 使用 `override` 但不合法; - `Shader::setMat4` 参数类型不匹配; - 多个标识符未声明(如 `planets`, `tp`, `vector`); 这些问题表明:**缺少必要的 C++ 标准库头文件、类定义未正确包含、函数签名不一致、语法使用不当**。 --- ## 详解 ### ✅ 错误原因及修复方案(逐项解决) --- #### ❌ 错误 1:`"vector": 不是 "std" 的成员` 和 `“vector” : 未声明的标识符` > 原因:没有包含 `<vector>` 头文件。 ✅ **修复方法:在 `main.cpp` 中添加** ```cpp #include <vector> #include <memory> // 用于 unique_ptr ``` --- #### ❌ 错误 2:`"planets": 未声明的标识符` > 原因:变量 `planets` 是用 `std::vector<std::unique_ptr<Planet>>` 定义的,但缺少头文件或命名空间。 ✅ **确保 `main.cpp` 开头有:** ```cpp #include <vector> #include <memory> using namespace std; ``` 或者写全称: ```cpp std::vector<std::unique_ptr<Planet>> planets; ``` --- #### ❌ 错误 3:`TexturePool::getInstance()` 找不到 / `TexturePool` 不是类名 > 原因:`TexturePool.h` 没有被 `#include` 或未定义。 ✅ **在 `main.cpp` 和 `Object.cpp` 中加入:** ```cpp #include "TexturePool.h" ``` ⚠️ 确保文件路径正确,并已添加到工程中。 --- #### ❌ 错误 4:`Background::render override` 报错 > 原因:你在 `Background.h` 中写了 `void render(...)` 并加了 `override`,但它并**没有覆盖基类中的虚函数**。因为 `Object::render` 是非虚函数! 虽然之前我们用了 `virtual ~Object()`,但 `render()` 函数本身不是虚函数。 ✅ **修复方法一(推荐):将 `Object::render` 改为虚函数** 修改 `Object.h` 中: ```cpp virtual void render(glm::mat4& view, glm::mat4& projection); ``` 然后在 `Background.h` 中可以安全使用 `override`。 ✅ **修复方法二(临时):移除 `override` 关键字** 如果你不想改基类,就在 `Background.h` 改成: ```cpp void render(glm::mat4& view, glm::mat4& projection); // 去掉 override ``` 并在 `.cpp` 实现时注意参数一致。 --- #### ❌ 错误 5:`Shader::setMat4` 参数不能从 `glm::mat4` 转换为 `const float*` > 原因:`setMat4` 接收的是 `const float*`,但你传入的是 `glm::mat4` 对象。 ✅ **修改 `Shader.h` 和调用方式** 📌 修改 `Shader.h` 中的函数声明为更安全的形式: ```cpp void setMat4(const std::string& name, const glm::mat4& matrix); ``` 📌 修改 `Shader.cpp` 实现: ```cpp void Shader::setMat4(const std::string& name, const glm::mat4& mat) { glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, glm::value_ptr(mat)); } ``` 📌 此时你可以直接传 `model`、`view` 等矩阵: ```cpp shader->setMat4("model", model); // 正确! ``` --- #### ❌ 错误 6:`auto p : planets` 报错(C2530、C3531、C2143) > 原因:这是范围 for 循环语法错误。`auto p` 是拷贝智能指针?不允许!且可能缺少头文件支持。 ✅ **正确写法:使用引用 + 包含头文件** ```cpp #include <vector> #include <memory> // ... for (const auto& p : planets) { p->update(dt); p->render(view, proj); } ``` > 注意: - `auto&` 表示引用,避免拷贝 `unique_ptr` - 加 `const` 更安全 --- #### ❌ 错误 7:`Sphere` 不是类或命名空间名称 > 原因:`Background.cpp` 中使用了 `Sphere::initData(...)`,但没有包含 `Sphere.h` ✅ **在 `Background.cpp` 开头添加:** ```cpp #include "Sphere.h" ``` 否则编译器不知道 `Sphere` 是什么。 --- #### ❌ 错误 8:`Background` 继承自 `Object`,却调用 `Sphere::initData(...)` > 逻辑错误:你写的是: ```cpp void Background::initData(DataParam* param) { DataParam p = {60, 60, 500.0f, 0}; Sphere::initData(&p); // ❌ 错误!Background 不是 Sphere! } ``` 📌 `Background` 是 `Object` 的子类,不是 `Sphere` 的子类,所以不能调用 `Sphere::initData()`。 ✅ **正确做法:自己生成顶点数据** 由于 `Background` 是一个巨大的球体,你应该复用 `Sphere` 的顶点生成逻辑,但不要继承关系。 📌 推荐重构方案: 👉 方法一(推荐):让 `Background` 继承 `Sphere` ```cpp class Background : public Sphere { public: Background(); void initData(DataParam* param = nullptr) override; void render(glm::mat4& view, glm::mat4& projection) override; void update(float dt) override {} }; ``` 👉 构造函数中指定着色器和贴图: ```cpp Background::Background() : Sphere("shaders/background.vs", "shaders/background.fs", "background") { } ``` 👉 `initData` 直接复用 `Sphere` 的逻辑: ```cpp void Background::initData(DataParam* param) { DataParam p = {60, 60, 500.0f, 0}; Sphere::initData(&p); } ``` 👉 同时重写 `render` 忽略摄像机平移: ```cpp void Background::render(glm::mat4& view, glm::mat4& projection) { glm::mat4 viewNoTrans = glm::mat4(glm::mat3(view)); // 移除位移 Object::render(viewNoTrans, projection); } ``` --- ### ✅ 总结:必须做的修改清单 | 文件 | 修改内容 | |------|---------| | `main.cpp` | 添加 `#include <vector>`, `#include <memory>`, `#include "TexturePool.h"` | | `Object.h` | 将 `render(...)` 改为 `virtual void render(...)` | | `Shader.h/.cpp` | `setMat4` 参数改为 `const glm::mat4&`,使用 `glm::value_ptr` | | `Background.h` | 改为继承 `Sphere`,去掉 `override` 或正确定义 | | `Background.cpp` | 包含 `Sphere.h`,调用 `Sphere::initData` 合法 | | 所有 `.cpp` | 确保包含顺序:`glad.h → glfw3.h → glm...` | | 所有范围 for | 使用 `const auto&` 避免拷贝 | --- ## 知识点(列出该代码中遇到的知识点) 1. **C++标准库头文件依赖** `vector` 和 `unique_ptr` 必须包含 `<vector>` 与 `<memory>`。 2. **虚函数与重写规则** 只有基类函数为 `virtual` 时,派生类才能使用 `override`。 3. **GLM矩阵传递规范** 使用 `glm::value_ptr(mat)` 获取首元素地址以传入 `glUniformMatrix`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值