我正在尝试在网格中为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);
}
上面的代码本质上是一个愚蠢的typeDef数,涵盖了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循环中的范围内)
答案 0 :(得分:0)
最好的解决方案是使用emplace_back。传入所有构造函数参数,而不是构造对象。这允许向量仅在需要时创建对象一次。
http://en.cppreference.com/w/cpp/container/vector/emplace_back
答案 1 :(得分:0)
好吧,我建议您不要禁用复制分配(operator=
),原因如下:
无需明确考虑用户定义的运算符&amp;因为元素必须是可复制的(23.2 [container.requirements]第3段)和copyconstructible(17.6.3.1 [utility.arg.requirements])指定运算符&amp;的要求。
取决于所需的操作,但总的来说它保持不变。
因此,添加到对象复制构造能力将丰富您可能使用的算法std
。
说完这个
为了防止这种缺陷,C++11
定义构建对象的std::vector::emplace_back
,不执行复制或移动操作。
这些是您的选择。