资讯动态

C++ 第 21 课:struct —— 把一组相关数据打包在一起

发布时间:2026/10/4 19:08:04 来源:尧图企业网站定制
答案与下一课上一课标准答案A是 char表示单个字符。A是字符串通常配合 std::string 使用。name[0] R name[2] b name.size() 5因为R o b o t 0 1 2 3 4输出1因为state ERROR成立。最后c Joint Ready因为 std::string 可以使用 进行字符串拼接。第 21 课struct —— 把一组相关数据打包在一起现在开始进入一个非常重要的新阶段。前面我们保存机械臂关节信息可能会写double angle 30.0; double speed 10.0; double temperature 45.0; bool enabled true;这些变量都在描述同一个关节。问题来了如果有 6 个关节怎么办可能变成double joint1_angle; double joint1_speed; double joint1_temperature; bool joint1_enabled; double joint2_angle; double joint2_speed; double joint2_temperature; bool joint2_enabled; // ...很快就会乱。这时候我们需要struct也就是结构体1. struct 最直觉的理解你可以把 struct 理解成自己设计一种新的“数据盒子”。以前int double bool都是 C 已经提供的数据类型。比如double angle 30.0;但现在我们想定义一种新的类型Joint这个类型里面同时拥有角度 速度 温度 是否使能于是struct Joint { double angle; double speed; double temperature; bool enabled; };这就是我们自己定义的Joint 类型。2. 先不要把 struct 想得太复杂以前double angle;一个变量只能直接代表一个数据。而现在Joint joint1;这个变量里面可以装很多相关数据joint1 ┌────────────────────┐ │ angle │ │ speed │ │ temperature │ │ enabled │ └────────────────────┘所以struct 把多个相关变量打包到一起。3. 逐行解释看struct Joint { double angle; double speed; bool enabled; };第一行struct Joint意思是我要定义一种新的结构体类型名字叫 Joint。然后{表示这个结构体内部有哪些成员。double angle;表示每一个 Joint 都有一个 double 类型的 angle。double speed;表示每个 Joint 都有一个 speed。bool enabled;表示每个 Joint 都有一个真假状态 enabled。最后};特别注意struct 定义结束的 } 后面还有一个分号 ;也就是};这和普通函数void test() { }不一样。4. 定义完 Joint 后怎么用定义struct Joint { double angle; double speed; bool enabled; };然后可以Joint joint1;这和int a;非常像。只不过int是 C 自带类型。而Joint是我们刚才自己定义的类型。5. 怎么访问里面的数据需要使用.这个点号。例如joint1.angle 30.0; joint1.speed 10.0; joint1.enabled true;你可以读成joint1 的 angle joint1 的 speed joint1 的 enabled所以.你现在可以先理解成“里面的”6. 和之前的 std::vector 联系起来你之前看过data.push_back(10);这里也有.其实data.push_back(...)也可以粗略读成data 里面的 push_back() 功能。而joint1.angle就是joint1 里面的 angle。后面学 class 时我们会正式解释这个点号。7. 一个完整例子#include iostream struct Joint { double angle; double speed; bool enabled; }; int main() { Joint joint1; joint1.angle 30.0; joint1.speed 5.0; joint1.enabled true; std::cout joint1.angle std::endl; std::cout joint1.speed std::endl; return 0; }输出30 58. 内存思维可以把Joint joint1;想成一个大盒子joint1 ┌─────────────────┐ │ angle │ → 30.0 ├─────────────────┤ │ speed │ → 5.0 ├─────────────────┤ │ enabled │ → true └─────────────────┘所以 joint1 不是单纯保存一个数。它是一整组数据。9. 为什么这对机器人特别重要因为现实中的“关节”本来就是一个整体对象。一个机械臂关节可能有关节角度 目标角度 速度 电流 温度 故障状态 是否使能这些数据本来就属于同一个关节。所以可以写struct Joint { double current_angle; double target_angle; double speed; double current; double temperature; bool enabled; bool error; };这样比定义一堆散乱变量清晰得多。10. 创建多个关节定义一次struct Joint { double angle; double speed; };以后可以创建Joint joint1; Joint joint2; Joint joint3;每个都是独立的数据。例如joint1.angle 10.0; joint2.angle 20.0; joint3.angle 30.0;它们互不影响。11. 就像设计了一个“模板”你可以把struct Joint { double angle; double speed; };理解成Joint 的设计图纸。而Joint joint1; Joint joint2;就是按照这个设计图纸造了两个实际对象。类似Joint 图纸 ┌─────────────┐ │ angle │ │ speed │ └─────────────┘ 制造 joint1 ┌─────────────┐ │ angle 10 │ │ speed 5 │ └─────────────┘ joint2 ┌─────────────┐ │ angle 20 │ │ speed 8 │ └─────────────┘12. 创建时直接赋值也可以写Joint joint1 {30.0, 5.0, true};如果结构体定义是struct Joint { double angle; double speed; bool enabled; };那么按照顺序30.0 → angle 5.0 → speed true → enabled所以Joint joint1 {30.0, 5.0, true};就相当于joint1.angle 30.0; joint1.speed 5.0; joint1.enabled true;13. 顺序一定要注意假设struct Joint { double angle; double speed; bool enabled; };那么Joint joint1 {30.0, 5.0, true};是按结构体成员定义顺序对应的。所以如果成员很多这种写法可能不如逐个赋值直观。初学阶段建议你优先看懂joint1.angle 30.0; joint1.speed 5.0;14. struct 里面可以有 std::string例如#include string struct Joint { std::string name; double angle; bool enabled; };然后Joint joint1; joint1.name Joint1; joint1.angle 30.0; joint1.enabled true;于是一个关节同时拥有名字 角度 状态15. 完整机器人例子#include iostream #include string struct Joint { std::string name; double angle; double speed; bool enabled; }; int main() { Joint joint1; joint1.name Joint1; joint1.angle 30.0; joint1.speed 5.0; joint1.enabled true; std::cout joint1.name std::endl; std::cout joint1.angle std::endl; std::cout joint1.speed std::endl; return 0; }输出Joint1 30 516. struct 数组 非常适合六轴机械臂现在开始真正结合起来。我们已经定义struct Joint { double angle; double speed; bool enabled; };然后可以创建Joint joints[6];这是什么意思不是6 个 double而是6 个 Joint可以画成joints [0] [1] [2] ... ┌─────────┐ ┌─────────┐ ┌─────────┐ │ angle │ │ angle │ │ angle │ │ speed │ │ speed │ │ speed │ │ enabled │ │ enabled │ │ enabled │ └─────────┘ └─────────┘ └─────────┘这已经很像真实六自由度机械臂的数据结构了。17. 怎么访问例如joints[0].angle 10.0;拆开joints[0]表示第 1 个 Joint。然后.angle表示这个 Joint 里面的 angle。所以joints[0].angle就是第 1 个关节的角度。18. 六轴机械臂例子Joint joints[6]; joints[0].angle 10.0; joints[1].angle 20.0; joints[2].angle 30.0; joints[3].angle 40.0; joints[4].angle 50.0; joints[5].angle 60.0;然后可以配合for统一输出for (int i 0; i 6; i) { std::cout joints[i].angle std::endl; }输出10 20 30 40 50 6019. 现在你已经把很多知识串起来了看这一句std::cout joints[i].angle std::endl;你现在可以一层层拆joints ↓ 一个 Joint 数组 [i] ↓ 取第 i 个 Joint .angle ↓ 取这个 Joint 里面的 angle std::cout ↓ 输出它这就是阅读复杂 C 代码的正确方法一层一层拆而不是整句硬看。20. struct 也能传进函数例如void printJoint(Joint joint) { std::cout joint.angle std::endl; }然后Joint j; j.angle 30.0; printJoint(j);输出30不过这里Joint joint仍然是值传递。也就是说会复制一个 Joint。21. 又和引用连起来了如果结构体比较大我们可能不希望复制。就可能写void printJoint(const Joint joint) { std::cout joint.angle std::endl; }这里出现了const Joint joint你已经认识表示引用。但const我们还没正式学。所以现在不要硬啃这一句。你只需要知道以后大型结构体经常通过引用传入函数避免复制。下一阶段会讲 const。22. struct 和 class 有什么关系你目标里还有class 面向对象其实struct和class关系非常近。现在我们先把 struct 理解成打包数据。以后 class 会进一步变成数据 操作这些数据的函数例如class Robot { // 机器人数据 // 机器人功能 };所以 struct 是学习类非常好的过渡。23. 本课核心以前double angle; double speed; bool enabled;是三个散乱变量。现在struct Joint { double angle; double speed; bool enabled; };把它们打包成一种新类型Joint然后Joint joint1;创建一个具体关节。使用joint1.angle joint1.speed joint1.enabled本课小练习第 1 题struct Motor { double speed; bool enabled; };那么Motor m; m.speed 100.0; m.enabled true;m.speed 是多少第 2 题下面struct Joint { double angle; double speed; };Joint 是变量名还是我们自己定义的新类型第 3 题Joint joints[6];是什么意思第 4 题joints[2].angle 45.0;用自己的话解释这句话。下一课我们讲第 22 课const —— “这个值不允许被修改”你会开始理解const double PI 3.14159;以及为什么真实工程里经常写void printJoint(const Joint joint)这会把你之前学过的变量、引用、函数参数、struct真正连起来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑