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:不,我只是在写这个类。看起来好像成功了。如果您编写了单元测试,您就会知道它是有效的。