std :: vector const元素改变了

时间:2013-11-12 16:43:35

标签: c++ pointers vector const 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();
}

向上的向量被声明为

std::vector<meshType> meshes;

我对C ++有相当常规的经验,但我仍然陷入了一些基本的困境 不时出错。看起来它可能是其中之一,但我不确定。

问题在于,当我添加网格并打印它时,它看起来很好,但是当模拟器打勾并且我再次打印时,它已经变为当前在模拟器中的网格。 这让我怀疑我是在拯救一个指针,但我不能为我的生活找到方法。

我orignaly并没有推送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());
}

1 个答案:

答案 0 :(得分:2)

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

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

如果未在声明和定义中将const标记为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