我有一个奇怪的问题,即使 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/