c++ - std::vector const 元素发生变化

标签 c++ pointers vector constants std

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

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

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

进一步将 vector 声明为

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());
}

最佳答案

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

list.push_back(e)将复制 e您作为 vector 内部的参数给出的元素,因此 list 内的新元素不会const 。您需要将容器定义为 std::list<const meshType>但是如果有任何内容修改了容器内的元素,您将无法编译代码。

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

在头文件中:

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

在源文件中:

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

更多信息:

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

当您将类对象定义为 const 时, vertices指针将是常量,但不是它指向的数据。无法将新地址分配给 vertices但它可以修改它所指向的内容。您仍然需要将其定义为 const Type* vertices; ,如果你不把 const 放在那里,它就是 Type* const vertices;如果对象是 const .

关于c++ - std::vector const 元素发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934923/

相关文章:

c - 我怎么能初始化一个分配了零字节的指针呢?

c++ - C++ 中的 lower_bound()

c++ - 关闭 MainWindow 后 Qt 应用程序仍在运行

c++ - 求 5 和 3 的所有倍数之和小于 1000 的这个 C++ 代码有什么问题?

c++ - std::function不起作用,但是普通的旧函数指针起作用-为什么?

c - 刚刚在 C 中尝试了简单的指针,但很令人困惑

r - 修改向量以仅包含升序元素

c++ - 从 C++ 中的 vector 取消引用指向对象的指针

c++ - 指针 'this+1' 在 C++ 中指的是什么?

c++ - 列表循环检测