如何从另一个结构体为结构体赋值?——job结构体中tasks成员的赋值难题
解决C++中job结构体tasks成员的赋值问题
嘿,我来帮你搞定这个问题~ 你遇到的核心问题是:job里的tasks是queue<command*>类型——它存储的是command对象的指针,而不是command对象本身,所以直接用command变量赋值肯定行不通。下面给你两种靠谱的解决方案,按需选择:
方案一:使用动态分配的command指针入队
如果你确实需要用指针队列(比如要在多个地方共享command对象,或者需要多态特性),可以通过new创建command的动态实例,再把指针推入队列:
// 先创建command对象的指针 command* cmd1 = new command{"clean", 5}; command* cmd2 = new command{"backup", 10}; // 将指针推入tasks队列 job a; a.time = 20; a.ID = 2; a.tasks.push(cmd1); a.tasks.push(cmd2);
⚠️ 注意:用new分配的内存需要手动释放,否则会造成内存泄漏。在job不再使用时,记得遍历队列清理每个指针:
while (!a.tasks.empty()) { delete a.tasks.front(); // 释放指针指向的内存 a.tasks.pop(); // 弹出队列元素 }
方案二:改用值类型队列(更推荐,更安全)
如果不需要共享command对象,只是单纯存储任务,建议把tasks的类型改成queue<command>(存储对象而非指针),这样就可以直接用command变量赋值,还不用操心内存管理:
首先修改job结构体:
struct job{ queue<command> tasks; // 把command*改成command int ID = 0; jobState *table = NULL; int time = 0; };
然后赋值就非常简单了:
job a; a.time = 20; a.ID = 2; // 直接创建command对象入队 command cmd1{"clean", 5}; a.tasks.push(cmd1); // 或者直接用emplace原地构造command对象,更高效 a.tasks.emplace("backup", 10);
选择建议
- 如果你的command需要被多个job或其他模块共享,或者command是某个基类(需要多态),就用方案一;
- 否则优先选方案二,代码更简洁,也避免了内存泄漏的风险。
内容的提问来源于stack exchange,提问作者Mah
相关产品推荐
相关产品推荐

