【问题标题】:std::vector const elements changestd::vector 常量元素改变
【发布时间】:2013-11-12 16:43:35
【问题描述】:

我有一个奇怪的问题,即 std::vector 中的元素即使设置为 const 也会发生变化。代码如下所示:

for (int i = 0 ; i < simLength ; i++) {
    const meshType m = meshType(*(simulator->getMesh()));
    meshes.push_back(m);

    printMeshes();
    simulator->tick();
    printMeshes();
}

进一步的向量被声明为

std::vector<meshType> meshes;

我在 C++ 方面有相当常规的经验,但我仍然对一些基本知识感到困惑 不时出现错误。这看起来可能是其中之一,但我不确定。

问题是当我添加一个网格并打印它时,它看起来很好,但是当模拟器打勾并再次打印它时,它已经变成了当前在模拟器中的网格。 这让我怀疑我在保存指针,但我终生无法知道如何保存。

我最初并没有推送 const 对象,而是拼命改变它以使其工作。

任何提示都会被应用。

== 编辑 ==

meshType 是 mmesh 类的 typedef,其中包含一个复制构造函数:

MFloatPointArray* vertices;
MIntArray* faceCounts;
MIntArray* faceConnects;

mmesh::mmesh(const gmesh& orig) {
    vertices = new MFloatPointArray(*orig.getVertices());
    faceCounts = new MIntArray(*orig.getFaceCounts());
    faceConnects = new MIntArray(*orig.getFaceConnects());
}

【问题讨论】:

  • 您的meshType 是否实现了正确的复制语义? vector::push_back 将元素复制到向量中。您添加的const 在此处无效。
  • 如果这就是您的意思,我已经为网格创建了一个复制构造函数(请参阅有问题的编辑)。如果没有,我们将给予解释。

标签: c++ pointers vector constants std


【解决方案1】:

std::vector,因为它动态增长并且是连续的。这需要在重新分配后复制/移动,不能直接与 const 类型一起使用。您要么需要使用指针向量,以便仅移动指针而不是对象或其他容器(如 std::deque),除非您 erase 一个元素或类似容器,否则不需要移动/复制元素std::list 永远不会移动/复制元素。

list.push_back(e) 会将您作为参数提供的e 元素复制到向量内部,因此list 中的新元素不会是const。您需要将您的容器定义为std::list&lt;const meshType&gt;,但是如果有任何东西修改了容器内的元素,您将无法编译代码。

如果任何成员函数在声明和定义中未标记为 const,则将假定它们正在修改类。在 const 对象上,您只能调用标记为 const 的方法:

在头文件中:

class A
{
 ...
 size_t getSomething() const;
}

在源文件中:

A::getSomething() const
{ ... }

更多信息:

const 函数只能更改声明为mutable 的变量。

当您将类对象定义为const 时,vertices 指针将是 const 但不是它指向的数据。某些东西无法为vertices 分配新地址,但它可以修改它指向的内容。您仍然需要将其定义为 const Type* vertices;,而无需将 const 放在那里,如果对象是 const,则它是 Type* const vertices;

【讨论】:

  • 我试图将类型标记为 const meshType 但这并没有改变任何遗憾。并且使用的方法都标记为 const 所以应该没问题。这再次让我想到它的指针,这通常是我出错的地方。
  • @Martinnj 我已经对答案进行了一些编辑。更改的内容是否标记为mutable?如果不是,并且某些东西仍然修改了 std::vector&lt;const meshType&gt; 的元素,那么也许无论修改它使用 const_cast 来抛弃 constness (const_cast 在已构建的类上是未定义的行为)。
  • 不,改变的值是 mmesh 中 MFloatPointArray 中的内容。 (编辑问题中的顶点数组)。
  • 你不能(合理地)创建一个 const 对象的向量。元素需要是可分配的。你必须有一个 const 赋值运算符,这太荒谬了。
  • 那么你必须有一个移动构造函数,它接受一个 const r-value 引用,这也很荒谬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2014-06-13
  • 2011-12-27
  • 2012-06-09
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多