2

我有一个奇怪的问题,即 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());
}
4

1 回答 1

2

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

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

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

在头文件中:

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

在源文件中:

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

更多信息:

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

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

于 2013-11-12T16:50:21.453 回答