C++ 向量的setter函数<;someClass>;在c++;

C++ 向量的setter函数<;someClass>;在c++;,c++,operator-overloading,copy-constructor,C++,Operator Overloading,Copy Constructor,我有以下课程: class Vertex { public: float X; float Y; float Z; Vertex (float first, float second, float third){ X=first; Y=second; Z=third; } }; class Obj { vector<Vertex>vertexCoordinates;

我有以下课程:

class Vertex {

public: float X;
        float Y;
        float Z;

Vertex (float first, float second, float third){
          X=first;
          Y=second;
          Z=third;
    }

};


class Obj {


  vector<Vertex>vertexCoordinates;

  vector<vector<int>> faces;

  vector <vector<float>> faceNormals;

  vector <vector<float>> faceCenters; 

  string objName; 

  int vertexCount, faceCount, edgeCount;

  float maxX, minX, maxY, minY, maxZ, minZ, dx, dy, dz;


    setVertexCoordinates(vector <Vertex> vertexCoordinatesP) {

          vertexCoordinates = vertexCoordinatesP; //??
         // How should the assignment be defined? 

    }

};
类顶点{
公众:浮动X;
浮动Y;
浮动Z;
顶点(第一个浮动,第二个浮动,第三个浮动){
X=第一;
Y=秒;
Z=第三;
}
};
Obj类{
矢量坐标;
向量面;
向量面法线;
向量面心;
字符串对象名;
int vertexCount、faceCount、edgeCount;
浮点最大值,最小值,最大值,最小值,最大值,最小值,dx,dy,dz;
设置顶点坐标(向量顶点坐标){
vertexCoordinates=vertexCoordinates;/??
//任务应该如何定义?
}
};

我需要在这里创建一个复制构造函数吗?为
顶点
Obj
重载运算符
=

由于您的
顶点
只有基本的非指针成员,因此您不必为其定义复制构造函数:编译器将通过复制构造函数复制元素(在
浮点
的情况下,通常是按位复制)。
std::vector
的复制构造函数和赋值运算符是预定义的,在这里可以工作,因为您没有存储指针


(对于
std::vector
,所有权语义将不明确,因此您可能需要以不同的方式进行复制。)

从编译器获得的复制构造函数在这里就可以了。这同样适用于免费获得的赋值运算符或源代码中的字节。但是,您提供的构造函数消除了编译器提供的默认构造函数,您的对象需要一个默认构造函数才能放置在标准容器中。

您可能不需要重载这些,因为您没有任何指针或不可扫描的引用,因此默认的复制构造函数\assignment操作符可以正确处理它。

您可能应该使用POD而不是类:

struct Vertex { float x; float y; float z; };
要解决缺少建造商的问题,请使用工厂:

inline Vertex mk_Vertex (float x, float y, float z) {
  Vertex a; a.x = x; a.y=y; a.z=z; return a; }

inline Vertex mk_Planar (float x, float y) {
  Vertex a; a.x=y; a.y=y; a.z=0.0f; }
这将为您提供多个命名构造函数,并为Vertex留下一个POD,这意味着您也可以使用C样式的初始值设定项:

Vertex a = {1.0f, 2.0r, 3.0f };

这对于高阶聚合(如数组)或映射磁盘上和磁盘下的图像非常有用。

顶点
不是POD,因为它有一个用户声明的构造函数-例如,请参阅。它不使用bitwaise copy。它使用每个成员的副本构造函数。因此,就好像你做了x.m1=y.m1等等。@Martin York:True,但在
float
的情况下,通常可以归结为按位复制。不过更新了。你的单元测试失败了吗?@Martin York:不,我只是在写这个类。看起来好像成功了。如果您编写了单元测试,您就会知道它是有效的。