【问题标题】:error when adding into vector of pointers添加到指针向量时出错
【发布时间】:2025-12-01 10:50:01
【问题描述】:
class A{
  Add(const B&);
  vector <B*> vect;
};

A & A::Add(const B& obj){
  vect.push_back(&obj);
  return *this;
}

这里我得到 fpermissive 错误,因为 push_back 的参数是恒定的,我该如何摆脱这个?

我尝试在 Add 中创建本地副本,例如

B tmp;
tmp = obj;
vect.push_back(&tmp);

但我不确定这一点,当程序退出此方法 Add 时,tmp 被破坏,向量中的地址将指向内存中的无效位置?

【问题讨论】:

  • 您确定要存储指向您不知道其生命周期的对象的指针吗?

标签: c++


【解决方案1】:

您的问题源于 API 不一致。这里有 2 个选项:

  • Add的签名中删除constAdd(B&amp;)
  • 在向量中存储const B* 指针:vector&lt;const B*&gt; vect;

第一个选项将允许修改对象的内容,而第二个选项将禁止它。选择取决于您的程序逻辑。

【讨论】:

  • 如果我使用第二个选项,vector vect; 到底是什么?意思是 ?它会表现得像法线向量吗?
  • @lllook 这意味着向量将存储指向不可变对象的指针,即您将无法修改这些对象。区分通过修改存储在其中的指针来修改向量的能力与修改指向对象的能力是很重要的。你可以做前者,但不能做后者。
  • 谢谢,这似乎是我一直在寻找的效果
【解决方案2】:

您的问题是,如果您提供 const 引用作为 Add 的函数参数,您就是在告诉编译器您传递的任何内容都不会因为该函数而改变。 另一方面,您尝试在向量中存储一个非常量指针,这意味着该向量的用户可以更改与该指针相关的值。 要摆脱错误,您必须确定您真正希望从程序中获得的行为类型: 如果要存储对“B”对象的只读引用,则必须将它们作为 const 指针存储在向量中。如果您希望该向量的用户能够使用 B 的非常量函数,即更改 B,则必须将其作为非常量引用传递给 Add 函数。

【讨论】:

    最近更新 更多