我试图在一个网格中为x的每个不同的值创建一组平面,我已经创建了一个x的所有值的列表,我正在使用的程序/系统有一个平面类。
List<sampledPlane> planeListX;
vector normalX(1, 0, 0);
forAll(discreteX, x)
{
sampledPlane xPlane
(
"xPlane",
mesh,
plane
(
point(discreteX[x], 0, 0),
normalX
),
word::null,
true
);
planeListX.append(xPlane);
}
上面的代码本质上是一个愚蠢的typeDefs数,涵盖了一个vector<sampledPlane>
的声明,然后是操作planeListX.push_back(xPlane)
。我的平面的构造函数工作得很好,如果planeListX.append(xPlane);
行被注释掉,所有的构造函数都会很好地编译(尽管显然我的向量仍然是空的)。
当我取消对append
行的注释时,我会得到一组编译器错误,其中包含如下消息:
/home/christian/OpenFOAM/OpenFOAM-2.2.2/src/sampling/lnInclude/sampledSurface.H:78:7: error: non-static reference member ‘const Foam::polyMesh& Foam::sampledSurface::mesh_’, can’t use default assignment operator
class sampledSurface
我假设这样做的结果是我不能将构造的平面添加到向量中,因为这样做需要复制对象。
是否有可能以某种方式使用指针来完成此操作?还是应该深入研究库并尝试重写sampledPlane类以允许使用operator=
?我非常肯定,我会发现操作符是一个没有实现的private
函数,它只为阻止这类操作而设计。
顺便提一句,写:planeListX.append(sampledPlane("xPlane",mesh,plane(...),word::null, true));
和避免给很多平面起相同的名字更好吗?我的理解是,在命名它们的情况下,它们将被不断地覆盖,并且在这两种情况下都是临时的(或者是临时的,或者是在for循环中被限定范围的)。
发布于 2014-03-25 19:11:25
最好的解决方案是使用emplace_back。传递所有构造函数参数,而不是构造对象。这允许向量只在需要的地方创建对象一次。
发布于 2014-03-25 19:16:00
我建议您不要禁用复制分配(operator=
),原因如下:
C++03
没有必要显式地考虑用户定义的操作符&因为元素必须是可复制的(23.2 container.requirements第3段)和可复制的(17.6.3.1 utility.arg.requirements)指定操作符的要求。
C++11
取决于所需的操作,但总体上保持不变。
因此,增加对象复制构造能力将丰富您可能从std
中使用的算法。
说了这句话,
为了防止这种短路,C++11
定义了std::vector::emplace_back
,它在适当的位置构造您的对象,不执行复制或移动操作。
这些是你的选择。
https://stackoverflow.com/questions/22650687
复制相似问题