C ++:如果类禁用赋值运算符,是否可以创建一系列类对象(使用向量?)?

时间:2014-03-26 03:02:03

标签: c++ pointers object vector

我正在尝试在网格中为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循环中的范围内)

2 个答案:

答案 0 :(得分:0)

最好的解决方案是使用emplace_back。传入所有构造函数参数,而不是构造对象。这允许向量仅在需要时创建对象一次。

http://en.cppreference.com/w/cpp/container/vector/emplace_back

答案 1 :(得分:0)

好吧,我建议您不要禁用复制分配(operator=),原因如下:

C ++ 03

  

无需明确考虑用户定义的运算符&amp;因为元素必须是可复制的(23.2 [container.requirements]第3段)和copyconstructible(17.6.3.1 [utility.arg.requirements])指定运算符&amp;的要求。

C ++ 11

取决于所需的操作,但总的来说它保持不变。

因此,添加到对象复制构造能力将丰富您可能使用的算法std

说完这个

为了防止这种缺陷,C++11定义构建对象的std::vector::emplace_back,不执行复制或移动操作。

这些是您的选择。